簡體   English   中英

遍歷時如何從列表中刪除元素?

[英]How to remove an element from a list while traversing it?

我已經讀完了,請相信我。 從列表中刪除項目時,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

刪除它們的最佳方法是什么?

在迭代列表時不要更改列表的長度。 它不會工作。

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

獲取元素的索引並刪除它。

del somelist[n]

您可以使用照明理解-盡管您的問題可能出在__eq__ / __ne__方法的邊上(您應該發布它)。 嘗試一下,但是:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM