列表理解与迭代

时间:2017-10-29 14:20:02

标签: python list-comprehension

假设我有一个由整数元素组成的列表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正确地执行此操作?

3 个答案:

答案 0 :(得分:6)

您的语法错误

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]

答案 1 :(得分:4)

您需要在迭代部分之后编写过滤器。所以:

   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,然后为每个项0添加L[i],其中元素为小于或等于零。

话虽如此,您可以使用以下内容编写列表理解(更快)(

T = [l for l in L if l > 0]

因此,我们不是迭代索引,而是迭代l中的元素 L。我们还会对l进行过滤,并在过滤成功的情况下收益l

答案 2 :(得分:2)

虽然您可以使用列表解析来解决此问题,但您也可以将filter与lambda函数一起使用:

final_l = list(filter(lambda x:x > 0, L))