[英]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.