2017-10-12 36 views
2

我有兩個元組a = ((1, 'AB'), (2, 'BC'), (3, 'CD'))b = ((1, 'AB'), (2, 'XY'), (3, 'ZA'))。通過分析這兩個元組,可以發現元組中存在不匹配,即(2, 'BC')存在於a中,但(2, 'XY')存在於b中。查找元組中的不匹配並在Python中合併它們

我需要弄清楚這樣的錯配,並配備了具有值

result = ((2, 'BC', 'XY'), (3, 'CD', 'ZA')) 

(順序應當保存)

我能趕上保持爲Comparing sublists and merging them最近的參考元組,但是這是列表,我無法找到一種方法來處理元組。

有沒有一種方法可以執行此操作?

+2

你的代碼到目前爲止在哪裏?你有沒有被卡住? – smarx

+0

@ Jean-FrançoisFabre可以忽略這種情況。只有在不匹配的情況下,結果應該包含元組中的項目。 –

回答

5

由於無法從ab缺少的「鑰匙」(或這些價值觀應該被忽略),我會變成b成一本字典,然後循環上a和比較值。

a = ((1, 'AB'), (2, 'BC'), (3, 'CD')) 
b = ((1, 'AB'), (2, 'XY'), (3, 'ZA')) 

b = dict(b) 

mismatches = [(k,v,b[k]) for k,v in a if b.get(k,v) != v] 

print(mismatches) 

結果:

[(2, 'BC', 'XY'), (3, 'CD', 'ZA')] 

該方案具有幾乎1線,快速(因爲字典查找的)的優點,並保留順序。

if b.get(k,v) != v條件保護措施a具有一個數字不在b字典中的數字。在這種情況下,get回報v默認值和條件是False

+0

即使我們在'mismatches'行中使用'b.get(k)'而不是'b.get(k,v)'行 –

+1

,它似乎可以正常工作,因爲不會將默認值作爲來自'a'的值傳遞,意味着您'當'a'有一個額外的密鑰時會發生關鍵錯誤。嘗試一下。 –

0

如果列表都保證有號的元組相同的順序,你可以這樣做:

[ai + (bi[1],) for ai, bi in zip(a, b) if ai != bi] 

和如果在訂單上沒有保證,你可以這樣做:

[ai + (bi[1],) for ai, bi in zip(sorted(a), sorted(b)) if ai != bi] 
相關問題