如何在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]
答案 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)
迭代是相反的,所以当我们删除项目时,我们不需要担心索引会搞砸。