2015-09-14 121 views
3

的名單幾個要素我的元組的兩個列表一樣顯示在以下順序:比較元組

a = [(18, 299, 70, 33), (18, 323, 70, 34), 
(18, 448, 70, 35), (18, 548, 70, 36), (18, 613, 70, 37)] 

b = [(18, 223, 70, 37), (18, 299, 70, 38), 
(18, 323, 70, 39), (18, 448, 70, 40), (18, 548, 70, 41), (18, 613, 70, 42)] 

我想要什麼:

1)。我正在嘗試打印b中的元素,但不是a

2)。我想比較上面列出的列表,只比較單個元組的前三個元素,而不考慮該元組的不匹配最後一個元素,即37,38,39 ....因此,在上述情況下,我希望我的答案看起來像:

result = [(18,223,70,37)] 

所以你可以在這種情況下,算法將完全忽略了最後一個號碼或4元,而比較個別的元組看到的。因此,我希望如果元組的前三個元素匹配,那麼即使第四個元素可能相同也可能不相同,它可以預測沒有差別。

我試了一下:

除了搜索解決方案,我只是想嘗試set(b_value)-set(a_value)方法。但我知道它不會因爲這樣產生的結果的工作是這樣的:

set([(18, 613, 70, 42), (18, 448, 70, 40), (18, 548, 70, 41), (18, 299, 70, 38), (18, 323, 70, 39), (18, 223, 70, 37)])

這是很明顯的結果,因爲所有元組的最後一個元素不匹配,因此這種方法預測所有這樣的元組無與倫比。

編輯: 我想保留我的結果第四元素的值,所以在刪除所有元組所有4單元和比較是不是一種選擇。

回答

2

爲包含沒有最後一個元素的元組的第一個列表生成一個集合;你可以做一個第二遍歷b收集那些第一要素不是在集:

a_set = {t[:-1] for t in a} 
result = [t for t in b if t[:-1] not in a_set] 

算法上來說,這樣做的工作相同數量的兩個轉換成集,併產生一組差異。

演示:

>>> a = [(18, 299, 70, 33), (18, 323, 70, 34), 
... (18, 448, 70, 35), (18, 548, 70, 36), (18, 613, 70, 37)] 
>>> b = [(18, 223, 70, 37), (18, 299, 70, 38), 
... (18, 323, 70, 39), (18, 448, 70, 40), (18, 548, 70, 41), (18, 613, 70, 42)] 
>>> a_set = {t[:-1] for t in a} 
>>> [t for t in b if t[:-1] not in a_set] 
[(18, 223, 70, 37)] 
+0

這是完美的。感謝Martijin。 – Dhruvify