使用"if"过滤器在迭代器上循环的单行?

Tal*_*iss 55 python

愚蠢的问题:
我有一个简单的for循环,后跟一个简单的if语句:

for airport in airports:
    if airport.is_important:
Run Code Online (Sandbox Code Playgroud)

而且我想知道我是否能以某种方式将其写成单行.
所以,是的,我可以这样做:

for airport in (airport for airport in airports if airport.is_important):
Run Code Online (Sandbox Code Playgroud)

但它看起来如此愚蠢和冗余(for airport in airport for airport in airports...).
有没有更好的办法?

e-s*_*tis 75

不,没有更短的路.通常,您甚至会将其分成两行:

important_airports = (airport for airport in airports if airport.is_important)
for airport in important_airports:
    # do stuff
Run Code Online (Sandbox Code Playgroud)

这更灵活,更易于阅读,并且仍然不会消耗太多内存.

  • +1:只要写下你的意思.单线代码高尔夫不是一个好习惯. (14认同)
  • 谢谢 - 我真的很喜欢这个答案.虽然不是一个班轮,但它"捕捉了一个班轮的精神",因为有一个单一的缩进(我可以说我讨厌缩进,同时仍然喜欢Python ???).不需要额外的进口,并且通过使用适当的变量名称,第二行是完全可读的(谁关心我如何实施'重要机场').这是我的答案.再次感谢您的快速回复! (3认同)

Chr*_*heD 29

你可以做到

for airport in filter(lamdba x: x.is_important, airports):
    # do stuff...
Run Code Online (Sandbox Code Playgroud)

  • 从 Python 2.4(大约 2002 年)开始,您可以使用 [生成器表达式](https://docs.python.org/3/reference/expressions.html#generator-expressions) 并编写 `for airport in (airport for airport in airport if airport.is_important):` 这使得为此目的使用 `filter()` 有点过时了。 (2认同)

小智 15

我会在循环中使用负面防守.它是可读的,并没有引入额外的缩进级别.

for airport in airports:
    if not airport.is_important: continue
    <body of loop>
Run Code Online (Sandbox Code Playgroud)


for*_*ran 5

Mabe这个,但它或多或少相同的冗长...

import itertools

for airport in itertools.ifilter(lambda x: x.is_important, airports):
    ...
Run Code Online (Sandbox Code Playgroud)

  • 其实,谢谢你@tusbar!我没有要求它,但它是非常有用的(作为经常优化代码的人)和@fortran:这些小差异在一个大项目中非常快速地加起来.我在片段中添加了我最喜欢的答案,它实际上更快!:http://codepad.org/CN5jsYhX (3认同)