繁体   English   中英

列表理解与迭代

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

ifelse都存在时,语法为[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.

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