2013-02-07 124 views
1

我需要從列表中刪除元素,同時迭代它(我無法創建一個新的列表,因爲它是在我無法控制的代碼中引用)。刪除列表元素,而迭代它

我想出的最好的是:

last_index = len(somelist) - 1 
for (index,item) in enumerate(reversed(somelist)): 
    if somecondition(item): 
     del somelist[last_index - index] 

有沒有更好的方法?我也看到了這個post和這個one,但是沒有一個提供的解決方案是有效的或簡潔的(恕我直言)。

+0

您想要多簡潔和高效? [Alex Martelli的回答](http://stackoverflow.com/a/1208792/78845)似乎都是。與意見相關的問題與Stack Overflow不太匹配。 – Johnsyweb

+0

你確定你的代碼真的有效嗎?初始化'somelist'到'range(100)'和'somecondition(item)'到'item%2',我得到一個IndexError。 – mgilson

+0

@mgilson我的第一個想法是它應該是'del somelist [-index]'(用'enumerate(...,start = 1)')否則,我能想到的所有方法已經被前一篇文章所覆蓋 –

回答

2

你可以使用list comprehension + slice賦值,這當然更簡潔 - 我不知道效率(儘管我希望它在這方面做得更好,因爲你不需要保留每次刪除項目時都會在列表中移動元素...)

somelist[:] = [ x for x in somelist if not somecondition(x) ] 
+0

這大約快45%。謝謝。 – isedev

相關問題