0

如何在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

4 回答 4

4

您可以遍历列表的副本

for j in a[:]:

解决您问题的另一种方法是

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

这里a[:]表示a应该用列表推导替换的内容

于 2012-09-05T02:44:55.743 回答
3
a[:]=filter(lambda x:x<=2,a)

使用过滤器...

或列表理解

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

\编辑不破坏原始指针......虽然我不知道为什么......似乎不太完美的设计

于 2012-09-05T02:45:06.690 回答
2

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

相反,使用 filter() 或列表推导,就像 Joran 建议的那样,或者遍历列表的副本。

于 2012-09-05T02:46:58.950 回答
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)

迭代是反向的,因此我们不必担心删除项目时索引会混乱。

于 2012-09-05T03:00:56.477 回答