繁体   English   中英

Python:在for循环中使用理解

[英]Python: using comprehensions in for loops

我正在使用Python 2.7。 我有一个列表,我想使用for循环迭代该列表的一个子集受某些条件限制。 以下是我想要做的事情的说明:

l = [1, 2, 3, 4, 5, 6]
for e in l if e % 2 == 0:
    print e

在我看来它非常整洁和Pythonic,并且在各方面都很可爱,除了语法错误的小问题。 这个替代工作:

for e in (e for e in l if e % 2 == 0):
    print e

但是作为罪恶是丑陋的。 有没有办法直接添加条件到for循环结构,而不构建生成器?

编辑:您可以假设我实际上想要在e上执行的处理和过滤比上面的示例更复杂。 处理尤其不属于一行。

简单易读的解决方案有什么问题:

l = [1, 2, 3, 4, 5, 6]
for e in l:
    if e % 2 == 0:
        print e

你可以有任何数量的陈述,而不仅仅是一个简单的print e ,没有人不得不试图弄清楚它的作用。

如果你需要将子列表用于其他东西(不只是迭代一次),为什么不构造一个新的列表:

l = [1, 2, 3, 4, 5, 6]
even_nums = [num for num in l if num % 2 == 0]

现在迭代even_nums 还有一行,更具可读性。

尝试使用filter

for i in filter(lambda x: not x%2, l):
    print i

或者只是list comprehension

>>>[i for i in l if not i%2]

不能让它以那种方式工作。 但是这里有其他pythonic样式:

print [ e for e in l if e%2==0 ]

如果你想坚持自己的风格,请使用此列表理解:

for e in [x for x in l if x%2==0]:
    print e

所以这里e迭代一个由[x for x in l if x%2==0]中定义的列表[x for x in l if x%2==0]

好吧,你总是可以使用vanilla方法:

for e in l:
    if e % 2 == 0:
        print e

该号for语句需要什么来后in是评估一个迭代的对象(一个有一个表达式列表__iter__ )方法。

紧凑的替代方案是使用生成器或列表理解(列表具有在for循环开始之前必须构建列表的缺点 - 实际上给出两个循环)。 您必须选择语言提供的替代方案之一。

尝试这个:

filter(lambda x: x % 2 == 0, l)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM