2012-02-28 14 views
1

私は私の読書を私に信頼しました。そして、リストから項目を削除するときには、まだPythonが機能します。 グラフの実装があります。pythonはそれを横切ってリストから要素を削除します

ノードが接続しているエッジを削除するはずの1つの機能があります。 - >それらを削除するための最良の方法は何か

 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] 

を参照してください。問題は、アイテムを削除すると、次のアイテムがすべて1つ戻されますが、インデックスの位置は変わりません。削除されたアイテムの後のアイテムがスキップされるという効果があります。あなたがやっていることに応じて、リストの理解が望ましいです。

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

+1

もう1つのアプローチは、 'reversed()'を使ってリストを逆順に反復することです。そうすれば、アイテムを削除するだけで、すでに見たアイテムがシフトされます。 – kindall

+0

@ user965847、[はい](http://docs.python.org/tutorial/controlflow.html#for-statements) – senderle

1

要素のインデックスを取得し、それを取得します。

del somelist[n] 
0

あなたが点灯して理解を使用することができます - あなたの問題は、エッジのためにあなたの__eq__/__ne__方法であってもよいが(あなたがいることを投稿する必要があります)。ただし、これを試してみてください:

node.edgeList = [edge for edge in node.edgeList if edge != edgeToRemove] 
関連する問題