2012-01-31 25 views
2

原諒我,如果這是一個愚蠢的問題,我已經做了我最好的,但沒有成功看這件事,我絕不是一個Python的專家。Diff'ing混合名單

我寫了一些東西,以「差異」兩個列表:基本上,比較2所列出並填充的共同價值觀第三列表,而從原來的兩個列表中刪除它們。所以我寫了這一點:

list_1 = ["dog", "cat", "bird", "rabbit", "rabbit"] 
list_2 = ["fly", "monkey", "bird", "rabbit", "bear", "rabbit"] 
matches = [] 

for thing in list_1: 
    while thing in list_2: 
     list_1.pop(list_1.index(thing)) 
     popper = list_2.pop(list_2.index(thing)) 
     matches.append(popper) 

這讓我:

list_1: 
['dog', 'cat'] 
list_2: 
['fly', 'monkey', 'bear'] 
Matches: 
['bird', 'rabbit', 'rabbit'] 

這就是我所期待什麼/想......「兔子」顯示了兩次,因爲它是在兩個列表兩次。

但隨後使用相同的for循環,這樣的:

list_1 = ["dog", "cat", ["bird", "rabbit"], "rabbit"] 
list_2 = ["fly", "monkey", ["bird", "rabbit"], "bear", "rabbit"] 

打動了我:

list_1: 
['dog', 'cat', 'rabbit'] 
list_2: 
['fly', 'monkey', 'bear', 'rabbit'] 
Matches: 
[['bird', 'rabbit']] 

第二個「兔子」是不是被添加到該在比賽列表,它仍然在原件。這裏發生了什麼,我沒有得到?

回答

2

您應該考慮使用套這一點,就會簡化很多,你需要做的,例如:

set_1 = set(["dog", "cat", "bird", "rabbit", "rabbit"]) 
set_2 = set(["fly", "monkey", "bird", "rabbit", "bear", "rabbit"]) 

>>> set_1 & set_2 # elements common to both 
set(['bird', 'rabbit']) 
>>> set_1 - set_2 # elements in set_1 that are not in set_2 
set(['dog', 'cat']) 
>>> set_2 - set_1 # elements in set_2 that are not in set_1 
set(['fly', 'monkey', 'bear']) 

一個在這裏潛在的併發症之一是,你只能把可哈希類型的設定,讓你的第二個例子中,你將需要先內部列表轉換成元組:

set_1 = set(["dog", "cat", ("bird", "rabbit"), "rabbit"]) 
set_2 = set(["fly", "monkey", ("bird", "rabbit"), "bear", "rabbit"]) 

>>> set_1 & set_2 
set([('bird', 'rabbit'), 'rabbit']) 
>>> set_1 - set_2 
set(['dog', 'cat']) 
>>> set_2 - set_1 
set(['fly', 'monkey', 'bear']) 
+0

謝謝,我還沒有收到有關套在Python的想法。這是一個巨大的幫助! – learningKnight 2012-02-01 00:40:13

1

因爲當你經過一個列表,您刪除元素,讓說,「第n個」,您的列表變成「1」項短,所以指針則轉移到「第n個」 + 1你的新名單的元素,這是你的原始「第n + 2」。你可以做的是在你的for循環:

for thing in list_1[:]: 
    blablabla 

然後你循環通過列表的副本,並且不會被這個問題困擾。

1

您從編輯列表,你迭代它運行到一個錯誤。

還有一個在該代碼中的潛在的致命錯誤:

while thing in list_2: 
    list_1.pop(list_1.index(thing)) 

可導致ValueError如果thing是在list_2更多的時間比它處於list_1

0

方法1:

list_1 = ['dog', 'cat'] 
list_2 = ['fly', 'monkey', 'bear'] 
matches = [] 
for i in list_1: 
    if i not in list_2: 
     matches.append(i) 

方法2:

matches = [i for i in list_1 if i not in list_2]