2013-12-08 33 views
0

讓說,如果的Python:從列表中刪除特定值

# Displaying old and reference in columns for better visual # 

old=  [2,2,6,6,2,4, 6, 6, 8,2] 
reference=[7,1,6,2,4,9,10,16,12,5] 
ID=2 

什麼是更快地從參考列表中刪除變量ID和從舊列表中刪除 舊[參考文獻[ID匹配]的方式?

我碰巧在問我的問題的同時開發了這個解決方案......但有沒有更好的方法來做到這一點?

def List_Value_Removal(old,reference,ID): 
    counter=0 
    new=[] 
    for test in reference: 
     if ID!=test: 
      new.append(old[counter]) 
     checker+=1 
    return new 
+0

唉!我再次使用Array!現在解決它 – Bugboy1028

+1

你的意思是'如果ID!=測試'在那裏? – Roberto

+0

是的,編輯顯示 – Bugboy1028

回答

5

使用zip() function的名單,然後名單理解配對僅保持值在參考值不匹配ID

def List_Value_Removal(old, reference, ID): 
    return [v for v, ref in zip(old, reference) if ref != ID] 

values, references = List_Value_Removal(values, references, some_id) 

演示:

>>> old = [2, 2, 6, 6, 2, 4, 6, 6, 8, 2] 
>>> reference = [7, 1, 6, 2, 4, 9, 10, 16, 12, 5] 
>>> ID = 2 
>>> [v for v, ref in zip(old, reference) if ref != ID] 
[2, 2, 6, 2, 4, 6, 6, 8, 2] 

如果您還需要更新reference,請返回兩個列表:

def List_Value_Removal(old, reference, ID): 
    return zip(*((v, ref) for v, ref in zip(old, reference) if ref != ID)) 

演示:

>>> new, newref = zip(*((v, ref) for v, ref in zip(old, reference) if ref != ID)) 
>>> new 
(2, 2, 6, 2, 4, 6, 6, 8, 2) 
>>> newref 
(7, 1, 6, 4, 9, 10, 16, 12, 5) 
+0

這是一個很好的解決方案。你知道還有其他的方法嗎? – Bugboy1028

+0

這是最好的方法。你可以在你的方法中使用'enumerate()'而不是'counter',但是無論如何,列表理解將會以速度贏得它。 –

+0

@ Bugboy1028對不起,您需要從參考列表中刪除這些條目嗎? – Roberto

1

你也可以這樣做:

old=  [2,2,6,6,2,4,6,6,8,2] 
reference=[7,1,6,2,4,9,10,16,12,5] 
ID=2 

new = [old[i] for i in range(len(old)) if reference[i] != ID] 
+0

爲什麼不使用'[v for i,v如果引用[i]!= ID]'枚舉(old)?但是'zip()'版本更高效,因爲它不需要額外的項目查找。 –

+0

這很好,但是出於某種原因,它只是等價的還是更好? – Roberto

+0

速度更快;用'timeit'試試。 –

0

僅考慮這兩個名單是相同的長度,只有一個指標去除的,順便說一句,我們可以讓它更通用:

>>> old = [2,2,6,6,2,4, 6, 6, 8,2] 
>>> reference=[7,1,6,2,4,9,10,16,12,5] 
>>> id = 2 
>>> del old[(reference.index(id))] 
>>> old 
[2, 2, 6, 2, 4, 6, 6, 8, 2] 
>>> 
+0

這隻作品,如果有在參考文獻中只有**一個** ID的出現。如果有0個或多於1個,這將無法正常工作。 –

+0

其實沒有。如果我這樣做,它會刪除它看到的第一個值 – Bugboy1028

+0

好吧,讓我再想一想。 –

0
def List_Value_Removal(old,ref, id): 
    new = old[:] 
    ind = ref.index(id) 
    new.pop(ind) 
    return new 

不確定是否有特定的原因使用兩個數組? 如果您使用的字典:

ref = {7:2,1:2,6:6,2:6,4:2,9:4,10:6,16:6,12:8,5:2} 

你可能只是:

ref.pop(id) 
+0

爲什麼這個函數沒有返回?全局和局部變量是分開的。這個函數將返回None給我給你的新變量。在這個問題中,我根本不打算使用數組。 – Bugboy1028