我有一個列表L.刪除列表(蟒蛇)的許多元素
我可以通過做刪除元素i:
del L[i]
但如果我有一組非連續的索引中刪除?
I=set([i1, i2, i3,...])
這樣做:
for i in I:
del L[i]
將無法工作。
任何想法?
我有一個列表L.刪除列表(蟒蛇)的許多元素
我可以通過做刪除元素i:
del L[i]
但如果我有一組非連續的索引中刪除?
I=set([i1, i2, i3,...])
這樣做:
for i in I:
del L[i]
將無法工作。
任何想法?
EINE Minuten BITTE,ICH HAP EINE 克萊Problemo AVEC diese Religione。 - 艾迪·伊扎德通過反向遍歷列表保存迭代器(做他的印象馬丁路德 )
刪除是這個問題的共同解決方案。但另一個解決方案是將其變成另一個問題。使用某些標準(在您的情況下,索引存在於要刪除的索引列表中)而不是從列表中刪除項目,請創建一個新列表,以排除違規項目。
L[:] = [ item for i,item in enumerate(L) if i not in I ]
對於這個問題,你從哪兒拿出索引以I
擺在首位?您可以將獲取索引的邏輯組合起來並構建新列表。假設這是一個對象的列表,你只需要保留那些傳遞一個isValid
測試:
L[:] = [ item for item in L if item.isValid() ]
這比要簡單得多:
I = set()
for i in range(len(L)):
if not L[i].isValid():
I.add(i)
for i in sorted(I, reverse=True):
del L[i]
在大多數情況下,我把任何問題關於「如何從列表中刪除我不想要的項目」轉換爲「如何創建僅包含我想要的項目的新列表」。
編輯:根據Alex Martelli對this question的回答,將「L = ...」更改爲「L [:] = ...」。
這對於大型列表有何影響? – jmucchiello 2009-09-20 03:17:53
事實證明,列表得到的時間越長越好。請參閱此測試代碼:http://pastebin.com/f5bf9e3e8。 – PaulMcG 2009-09-20 04:25:17
這是這樣做的方式;注意「I」應該是一個集合,而不是一個列表。 – 2009-09-20 07:24:53
for i in I:
del L[i]
將無法正常工作,因爲(根據訂單),你可能會使迭代器 - 這通常會顯示爲您打算刪除剩餘列表中的一些項目。
從索引的相反順序刪除列表中的項目總是安全的。要做到這一點最簡單的方法是用排序():
for i in sorted(I, reverse=True):
del L[i]
如果您的原始清單數據可以安全地變成一組(即所有的獨特的價值觀,也不需要維護秩序),你也可以使用組操作:
Lset = set(L)
newset = Lset.difference(I)
你也可以做,也許一件Bag/Multiset,儘管它可能不值得。 Paul McGuire的第二個listcomp解決方案對於大多數情況來說絕對是最好的。
L = [ item for item in L if L.index(item) not in I ]
您可以使用numpy.delete
如下:
import numpy as np
a = ['a', 'l', 3.14, 42, 'u']
I = [1, 3, 4]
np.delete(a, I).tolist()
# Returns: ['a', '3.14']
如果你不介意,並在最後一個numpy
陣列結束了,你可以離開了.tolist()
。您也應該看到一些非常重要的速度改進,使其成爲一個更具可擴展性的解決方案。我沒有對它進行基準測試,但是numpy
操作是用C或Fortran編寫的編譯代碼。
dupe http://stackoverflow.com/questions/497426/deleting-multiple-elements-from-a-list – SilentGhost 2009-09-21 16:33:06