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