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

How to remove list elements in a for loop in Python?

本问题已经有最佳答案,请猛点这里访问。

我有一个清单

1
a = ["a","b","c","d","e"]

我想在for循环中删除此列表中的元素,如下所示:

1
2
3
for item in a:
    print item
    a.remove(item)

但它不起作用。我能做什么?


在使用for循环对列表进行迭代时,不允许从列表中删除元素。

重写代码的最佳方法取决于您试图做什么。

例如,您的代码相当于:

1
2
3
for item in a:
  print item
a[:] = []

或者,您可以使用while循环:

1
2
while a:
  print a.pop(0)

I'm trying to remove items if they match a condition. Then I go to next item.

您可以将不符合条件的每个元素复制到第二个列表中:

1
2
3
4
5
result = []
for item in a:
  if condition is False:
    result.append(item)
a = result

或者,您可以使用filter或列表理解,并将结果分配回a

1
a = filter(lambda item:... , a)

1
a = [item for item in a if ...]

其中...表示需要检查的条件。


遍历列表的副本:

1
2
3
4
5
6
7
8
9
10
11
12
13
>>> a = ["a","b","c","d","e"]
>>> for item in a[:]:
    print item
    if item =="b":
        a.remove(item)

a
b
c
d
e
>>> print a
['a', 'c', 'd', 'e']


正如其他答案所说,实现这一点的最佳方法是创建一个新的列表——或者迭代一个副本,或者只使用您想要的元素构建一个列表,然后将其分配回同一个变量。它们之间的区别取决于您的用例,因为它们对原始列表的其他变量的影响不同(或者,更确切地说,第一个变量影响它们,第二个变量不影响它们)。

如果出于某种原因,副本不是一个选项,那么您还有另外一个选项,它依赖于理解为什么要修改一个列表,而这个列表是迭代中断的。列表迭代的工作原理是跟踪一个索引,在循环中每次递增,直到它从列表的末尾消失。因此,如果在当前索引处(或之前)删除,则从该点到结尾的所有内容都将向左移动一个点。但是迭代器不知道这一点,并且有效地跳过下一个元素,因为它现在位于当前索引,而不是下一个索引。但是,删除当前索引之后的内容不会影响任何内容。

这意味着,如果您将列表迭代回前面,如果您在当前索引中删除一个项,它右边的所有内容都将向左移动-但这并不重要,因为您已经处理了当前位置右边的所有元素,并且您正在向左移动-左边的下一个元素不受更改的影响,因此,ITEorator为您提供了所期望的元素。

DR:

1
2
3
4
5
6
>>> a = list(range(5))
>>> for b in reversed(a):
    if b == 3:
        a.remove(b)
>>> a
[0, 1, 2, 4]

但是,在使代码易于阅读方面,复制通常更好。我只是为了完整起见才提到这种可能性。


如何创建一个新的列表,并将您想要的元素添加到该新列表中。迭代列表时不能删除元素


1
2
3
4
5
6
7
8
9
10
import copy

a = ["a","b","c","d","e"]

b = copy.copy(a)

for item in a:
    print item
    b.remove(item)
a = copy.copy(b)

工作:为了避免更改您正在迭代的列表,您可以复制a,对其进行迭代并从b中删除项目。然后你把b(修改后的副本)复制回a


回答这个可能有点晚,但我刚找到这个线程,我以前为它创建了自己的代码…

1
2
3
4
5
6
7
8
9
10
11
12
    list = [1,2,3,4,5]
    deleteList = []
    processNo = 0
    for item in list:
        if condition:
            print item
            deleteList.insert(0, processNo)
        processNo += 1

    if len(deleteList) > 0:
        for item in deleteList:
            del list[item]

这可能是一个很长的路,但似乎工作得很好。我创建了第二个列表,它只保存与要删除的列表项相关的数字。请注意,"插入"在位置0处插入列表项编号,并沿此方向推动其余项,因此在删除项目时,列表将从最高编号删除回最低编号,以便列表保持顺序。