如何在遍历列表时从列表中删除元素?

时间:2012-02-28 18:10:50

标签: python list

我完成了阅读,相信我。从列表中删除项目时,python仍会起作用。 我有一个图表实现。

现在有一个函数可以删除节点附加的一些边。我有一个Edge对象列表,想要按值删除它们......

代码是这样的:

for edge in node.edgeList:
...
   edgeToRemove = edge # edgeToRemove now holds something like <edge.Edge object at 0x107dcaf90>
   node.edgeList.remove(edgeToRemove) #KINDA WORKS - just doesnt behave consistently...It removes some edges but not others

删除它们的最佳方法是什么?

3 个答案:

答案 0 :(得分:6)

迭代时不要更改列表的长度。它不会起作用。

>>> l = range(10)
>>> for i in l:
...     l.remove(i)
... 
>>> l
[1, 3, 5, 7, 9]

请参阅?问题是,当您删除项目时,以下项目都会向后移动一个,但索引的位置保持不变。结果是跳过了被删除项目之后的项目。根据您正在做的事情,列表理解更可取。

>>> l = range(10)
>>> for i in l:
...     if i in [2, 3, 5, 6, 8, 9]:
...         l.remove(i)
... 
>>> l
[0, 1, 3, 4, 6, 7, 9]
>>> [i for i in range(10) if not i in [2, 3, 5, 6, 8, 9]]
[0, 1, 4, 7]

答案 1 :(得分:1)

获取元素的索引并将其删除。

del somelist[n]

答案 2 :(得分:0)

你可以使用点亮理解 - 虽然你的问题可能出在__eq__ / __ne__方法的边缘(你应该发布)。试试这个,但是:

node.edgeList = [edge for edge in node.edgeList if edge != edgeToRemove]