如何用“if”过滤器在迭代器上实现单行for循环?
我有一个简单的 for
循环,后面跟着一个简单的 if
语句:
for airport in airports:
if airport.is_important:
我在想,是否可以把这个写成一行。
可以的,我可以这样写:
for airport in (airport for airport in airports if airport.is_important):
但是这样看起来太傻了,而且有点重复(for airport in airport for airport in airports...
)。
有没有更好的写法呢?
9 个回答
26
我会在循环上使用一个负的条件判断。这样写起来比较清晰,而且不会增加额外的缩进层级。
for airport in airports:
if not airport.is_important: continue
<body of loop>
46
你可以这样做:
for airport in filter(lambda x: x.is_important, airports):
# do stuff...
93
不,没有更简短的方法。通常,你甚至会把它分成两行:
important_airports = (airport for airport in airports if airport.is_important)
for airport in important_airports:
# do stuff
这样做更灵活,读起来也更容易,而且不会消耗太多内存。