6 回答

TA貢獻1850條經(jīng)驗 獲得超11個贊
您可以使用列表推導(dǎo)來創(chuàng)建僅包含您不想刪除的元素的新列表:
somelist = [x for x in somelist if not determine(x)]
或者,通過分配切片somelist[:],您可以改變現(xiàn)有列表以僅包含所需的項目:
somelist[:] = [x for x in somelist if not determine(x)]
如果有其他參考somelist需要反映更改,則此方法可能很有用。
你也可以使用而不是理解itertools。在Python 2中:
from itertools import ifilterfalse
somelist[:] = ifilterfalse(determine, somelist)
或者在Python 3中:
from itertools import filterfalse
somelist[:] = filterfalse(determine, somelist)

TA貢獻2003條經(jīng)驗 獲得超2個贊
建議列表推導(dǎo)的答案幾乎是正確的 - 除了它們構(gòu)建一個全新的列表然后給它與舊列表相同的名稱,它們不會修改舊的列表。這與你在選擇性刪除方面所做的不同,就像在@ Lennart的建議中一樣 - 它更快,但是如果你的列表是通過多個引用訪問的,那么你只是重新安裝其中一個引用并且不改變列表對象本身可能導(dǎo)致微妙的,災(zāi)難性的錯誤。
幸運的是,獲得列表推導(dǎo)的速度和就地更改所需的語義非常容易 - 只需代碼:
somelist[:] = [tup for tup in somelist if determine(tup)]
注意與其他答案的細微差別:這個沒有分配到一個名字 - 它分配給恰好是整個列表的列表切片,從而替換同一個Python列表對象中的列表內(nèi)容 ,而不是僅僅重新設(shè)置一個引用(從之前的列表對象到新列表對象)就像其他答案一樣。

TA貢獻1826條經(jīng)驗 獲得超6個贊
您需要獲取列表的副本并首先迭代它,否則迭代將失敗,結(jié)果可能是意外結(jié)果。
例如(取決于列表的類型):
for tup in somelist[:]:
etc....
一個例子:
>>> somelist = range(10)
>>> for x in somelist:
... somelist.remove(x)
>>> somelist
[1, 3, 5, 7, 9]
>>> somelist = range(10)
>>> for x in somelist[:]:
... somelist.remove(x)
>>> somelist
[]

TA貢獻1853條經(jīng)驗 獲得超18個贊
for i in range(len(somelist) - 1, -1, -1):
if some_condition(somelist, i):
del somelist[i]
你需要倒退,否則就像鋸掉你所坐的樹枝一樣:-)
Python的2個用戶:更換range通過xrange避免產(chǎn)生硬編碼列表
添加回答
舉報