关于python:迭代列表的元素并执行’list.remove(x)’,但迭代后列表不为空

Iterating over the elements of a list and perform 'list.remove(x)', but the list is not empty after the iteration

本问题已经有最佳答案,请猛点这里访问。
1
2
3
4
5
a = [2, 3, 4, 5, 10, 12, 13, 17, 1234, 4321, 12345, 13579]
b = a
for i in b:
    a.remove(i)
print(a)

输出是[3,5,12,17,4321,13579]而不是预期的空列表,为什么是这样?

实际上,我想编写一个程序来删除列表中至少有一个偶数位的所有整数,也就是说。

1
2
3
4
5
6
a = [2, 3, 4, 5, 10, 12, 13, 17, 1234, 4321, 12345, 13579]
b = a
for i in b:
    if str(j) == 0 or str(j) == 2 or str(j) == 4 or str(j) == 6 or str(j) == 8:
        a.remove(i)
print(a)

但这并不符合预期。我应该如何调试它?


问题是,每次删除一个元素时,都会缩短列表的长度,但保持循环中的位置不变。本质上,当在这样的循环中移除时,跳过其他元素。以a = [1,2,3]为例。在第一次迭代中,删除1。所以a变成[2,3],你把位置移到第二个元素,现在是3,所以你跳过了2

如何通过过滤列表理解来修复它。下面是一个例子:

1
2
a = [2, 3, 4, 5, 10, 12, 13, 17, 1234, 4321, 12345, 13579]
filtered = [x for x in a if not any(digit in str(x) for digit in '02468')]


在迭代集合时修改集合(尤其是修改长度的操作)是一个"否"。在移除元素时,从脚底拉出地毯。

如果你倒着做,它会起作用:

1
2
3
   for i in reversed(b):
       a.remove(i)
   print(a)


通过列表迭代而不是删除元素不是一件好事:

所以

1
2
3
4
5
a = [2, 3, 4, 5, 10, 12, 13, 17, 1234, 4321, 12345, 13579]
b = a
for i in b:
    a.remove(i)
print(a)

另外,btw ba是一样的,因为你应该这样做:

1
b=a[:]

或:

1
b=a.copy()

要解决此问题,请执行以下操作:

1
2
3
4
5
a = [2, 3, 4, 5, 10, 12, 13, 17, 1234, 4321, 12345, 13579]
b = a[:]
for i in b[:]:
    a.remove(i)
print(a)

或:

1
2
3
4
5
a = [2, 3, 4, 5, 10, 12, 13, 17, 1234, 4321, 12345, 13579]
b = a[:]
while len(a):
    a.pop()
print(a)

请参见:如何克隆或复制列表?

以及:如何在Python的for循环中删除list元素?

也要回答Do:

1
print([i for i in a any(i.__contains__(x) for x in range(0,10,2))])