Python:在for循环中使用理解

时间:2015-06-26 11:26:55

标签: python python-2.7

我使用的是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上执行的处理和过滤比上面的示例更复杂。处理尤其不属于一行。

5 个答案:

答案 0 :(得分:9)

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

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。还有一行,更具可读性。

答案 1 :(得分:2)

使用filter

尝试此操作
for i in filter(lambda x: not x%2, l):
    print i

或只是list comprehension

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

答案 2 :(得分:1)

不能让它以这种方式运作。但是这里有其他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]

定义的列表

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

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

答案 3 :(得分:1)

没有。 for语句要求in之后的内容是一个表达式列表,它评估为可迭代对象(具有__iter__)方法的对象。

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

答案 4 :(得分:-1)

试试这个:

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