如何在for循环中删除列表中的元素

时间:2012-09-05 02:42:55

标签: python list

如何在for循环中删除元素列表? 变量a不应该重新分配。修改它但不要重新创建它。 以下代码无法正常工作

a = [1,2,2,3,2,1,4]
i = 0
for j in a:
    print(j)
    if(j<=2):
        print('deleting ',i)
        del a[i]
    else:
        i+=1     
print(a) #[3, 2, 1, 4]

4 个答案:

答案 0 :(得分:4)

您可以遍历列表的副本

for j in a[:]:

解决问题的另一种方法是

a[:] = [j for j in a if j>2]

此处a[:]表示a的内容应替换为列表理解

答案 1 :(得分:3)

a[:]=filter(lambda x:x<=2,a)

使用过滤器......

或列表理解

a[:] = [itm for itm in a if itm > 2]

\编辑不破坏原始指针......虽然我不确定为什么......看起来不像完美的设计

答案 2 :(得分:2)

您不应删除当前正在迭代的列表元素。它可以搞乱迭代的索引 - 如果列表在python迭代时任意改变,那么它如何知道哪个元素应该是“正确的”下一个迭代的元素?

相反,使用filter()或list comprehension,就像Joran所建议的那样,或迭代列表的副本。

答案 3 :(得分:0)

虽然其他答案中的建议可能是最好的,如果列表中的过滤元素是你在循环中唯一做的事情,如果你正在做一堆其他的东西,只是偶然删除一些项目最后,迭代列表的索引可能是比filter或列表理解更好的方法:

for i in range(len(a)-1, -1, -1): # iterate in reverse order
    val = a[i]

    # do a bunch of stuff with val and/or i

    if (some_condition(val)):
        a.pop(i)

迭代是相反的,所以当我们删除项目时,我们不需要担心索引会搞砸。