如何在Python中的for循环中删除列表元素?
我有一个列表
a = ["a", "b", "c", "d", "e"]
我想在下面的for循环中删除这个列表中的元素:
for item in a: print item a.remove(item)
但它不起作用。 我能做什么?
您不能从列表中删除元素,同时使用for
循环进行迭代。
重写代码的最好方法取决于你想要做什么。
例如,您的代码等同于:
for item in a: print item a[:] = []
另外,你可以使用while
循环:
while a: print a.pop(0)
我试图删除项目,如果他们匹配的条件。 然后我去下一个项目。
您可以将符合条件的每个元素复制到第二个列表中:
result = [] for item in a: if condition: result.append(item) a = result
或者,您可以使用filter
或列表理解,并将结果返回给:
a = filter(lambda item:... , a)
要么
a = [item for item in a if ...]
其中...
代表你需要检查的条件。
迭代循环的副本:
>>> 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']
正如其他答案所说的,最好的办法就是创build一个新的列表 – 要么迭代一个副本,要么只用你想要的元素构造一个列表,并把它赋给同一个variables。 它们之间的区别取决于你的用例,因为它们不同地影响原始列表的其他variables(或者,第一个影响它们,第二个影响它们)。
如果一个副本由于某种原因而不是一个选项,那么您确实有另一个选项,它依赖于对修改正在迭代的列表的原因的理解。 列表迭代的工作原理是跟踪一个索引,每次在循环中增加它,直到它落在列表的末尾。 因此,如果您在当前指数(或之前)删除,那么从该点到结束的所有内容都会向左移动一个点。 但迭代器不知道这一点,并有效地跳过下一个元素,因为它现在处于当前索引处而不是下一个索引处。 但是,删除当前索引之后的内容不会影响事物。
这意味着如果您将列表迭代到最前面,如果您删除当前索引处的项目,则其右侧的所有内容都会左移 – 但这并不重要,因为您已经处理了右侧的所有元素当前位置,并且您正在向左移动 – 左侧的下一个元素不受该更改的影响,因此迭代器将为您提供期望的元素。
TL; DR:
>>> a = list(range(5)) >>> for b in reversed(a): if b == 3: a.remove(b) >>> a [0, 1, 2, 4]
但是,制作副本通常更易于使代码易于阅读。 为了完整性,我只提到了这种可能性。
如何创build一个新的列表,并添加你想要的新列表的元素。 遍历列表时不能删除元素
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
。
可能有点迟了回答这个,但我只是发现这个线程,我以前已经创build了我自己的代码…
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]
这可能是一个很长的路,但似乎运作良好。 我创build了第二个列表,只保存与要删除的列表项相关的数字。 请注意,“插入”将列表项编号插入到位置0,并将剩余部分按下,因此删除项目时,列表将从最高编号删除回最低编号,以便列表保持顺序排列。
删除function删除列表中的第一个元素(第0个索引元素)。 在for循环的第一个迭代中,从索引号0开始,打印它。 当您移动到索引编号1时,您不再在索引位置0处具有“a”,而是具有“b”。 所以你得到的将是'c'。 所以这段代码将只打印包含索引号的列表元素。