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

时间:2012-05-19 13:31:01

标签: python list

我有一个清单

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

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

for item in a:
    print item
    a.remove(item)

但它不起作用。我该怎么办?

6 个答案:

答案 0 :(得分:89)

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

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

例如,您的代码相当于:

for item in a:
  print item
a[:] = []

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

while a:
  print a.pop(0)
  

我正在尝试删除符合条件的项目。然后我去下一个项目。

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

result = []
for item in a:
  if condition is False:
    result.append(item)
a = result

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

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

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

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

答案 1 :(得分:45)

遍历列表副本:

>>> 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']

答案 2 :(得分:17)

正如其他答案所述,执行此操作的最佳方法是创建一个新列表 - 迭代副本,或构建仅包含所需元素的列表,并将其分配回同一个变量。它们之间的区别取决于您的用例,因为它们会不同地影响原始列表的其他变量(或者,第一个影响它们,第二个不影响它们)。

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

这意味着如果你将列表重复到前面,如果你删除当前索引处的一个项目,那么它的所有内容都向左移动 - 但这没关系,因为你已经处理了所有元素到当前位置的右侧,并且您向左移动 - 左侧的下一个元素不受更改的影响,因此迭代器会为您提供您期望的元素。

TL; DR:

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

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

答案 3 :(得分:2)

如何创建新列表并向新列表添加所需元素。迭代列表时无法删除元素

答案 4 :(得分:2)

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)

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

答案 5 :(得分:0)

回答这个问题可能有点晚了,但我刚发现这个帖子,我之前已经创建了自己的代码......

    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并按下其余部分,因此在删除项目时,列表将从最高编号中删除回到最低编号,以便列表按顺序排列。