如何用“if”过滤器在迭代器上实现单行for循环?

77 投票
9 回答
117130 浏览
提问于 2025-04-15 20:10

我有一个简单的 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

这样做更灵活,读起来也更容易,而且不会消耗太多内存。

撰写回答