2012-02-28 167 views
1

我已经完成了我的阅读信任我。当从列表中删除一个项目时,python仍然会运行。 我有一个图形实现。python从列表中删除元素,同时遍历它

现在有一个函数应该删除节点附加的一些边。我有边缘对象列表,并想值删除它们......

代码是这样的:

 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 

- >什么是删除它们的最好方法?

回答

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] 
+0

这一定是它!有关于此的任何文档? – kosta5 2012-02-28 18:15:02

+1

另一种方法是使用'reversed()'以相反的顺序遍历列表。这样,删除一个项目只会改变你已经看到的项目。 – kindall 2012-02-28 18:18:27

+0

@ user965847,[yes](http://docs.python.org/tutorial/controlflow.html#for-statements)。 – senderle 2012-02-28 18:18:32

1

获取元素的索引并删除它。

del somelist[n] 
0

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

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