2012-02-28 3 views
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] 

참조 ? 문제는 항목을 제거 할 때 다음 항목이 모두 하나씩 뒤로 이동하지만 색인의 위치는 동일하게 유지된다는 것입니다. 제거 된 항목 뒤에있는 항목이 건너 뛰게됩니다. 자신이하는 일에 따라 목록을 이해하는 것이 바람직합니다.

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

또 다른 접근법은'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] 
관련 문제