[英]list comprehension with iteration
假设我有一个由整数元素组成的列表L. 我想构建一个列表T,对于每个索引,我在0..len(L)中包含项目L [i],前提是它使用python中的List comprehension大于0。
我尝试了以下命令来执行此操作
T=[L[i] if L[i]>0 for i in range(len(L))]
但我不断收到语法无效的错误。 如何在python中使用List comprehension正确地做到这一点?
你的语法错了 :
L = [1,2,-4,5,-6,7,8,9]
T = [L[i] for i in range(len(L)) if L[i]>0]
输出:
[1, 2, 5, 7, 8, 9]
此外,您只需遍历列表中的元素,无需使用range
。 像这样: T = [i for i in L if i>0]
记住:
只有if
那里语法是[expression for var in list if ...]
当if
和else
都存在时,语法为[expression1 if ... else expression2 for var in list]
您需要在迭代部分之后编写过滤器 。 所以:
T=[L[i] for i in range(len(L)) if L[i]>0]
# \__/ \_______ ____________/ \___ ___/
# yield v v
# iteration filter
现在Python认为你想编写一个三元运算符 ,如:
T=[L[i] if L[i] > 0 else 0 for i in range(len(L))]
这是不正确的:在这里, L[i] if L[i] > 0 else 0
则为每个元素评估L[i] if L[i] > 0 else 0
为每个项目L[i]
添加0
,其中元素小于或等于零。
话虽这么说,你可以写你的列表理解更优雅(和更快),用:
T = [l for l in L if l > 0]
因此,我们不是迭代索引,而是迭代L
的元素 l
。 如果过滤成功,我们还会过滤l
和yield l
。
虽然您可以使用列表推导来解决此问题,但您也可以使用带有lambda函数的filter
:
final_l = list(filter(lambda x:x > 0, L))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.