假设我有一个由整数元素组成的列表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正确地执行此操作?
答案 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 ...]
当if
和else
都存在时,语法为[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))