如何在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]
您可以遍历列表的副本
for j in a[:]:
解决您问题的另一种方法是
a[:] = [j for j in a if j>2]
这里a[:]
表示a
应该用列表推导替换的内容
a[:]=filter(lambda x:x<=2,a)
使用过滤器...
或列表理解
a[:] = [itm for itm in a if itm > 2]
\编辑不破坏原始指针......虽然我不知道为什么......似乎不太完美的设计
您不应该删除当前正在迭代的列表的元素。它可能会弄乱迭代的索引 - 如果列表在 python 迭代它时任意更改,它如何知道哪个元素应该是下一个迭代的“正确”元素?
相反,使用 filter() 或列表推导,就像 Joran 建议的那样,或者遍历列表的副本。
如果从列表中过滤元素是您在循环中唯一要做的事情,那么其他答案中的建议可能是最好的,但如果您正在做很多其他事情并且最后只是偶然删除了一些项目,迭代列表的索引可能是比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)
迭代是反向的,因此我们不必担心删除项目时索引会混乱。