2016-06-08 101 views
0

的特定元素我有:如何添加元組

([(5,2),(7,2)],[(5,1),(7,3),(11,1)]) 

我需要添加具有相同的第一元件和第二元件。

輸出:這裏[(5,3),(7,5),(11,1)]

+0

請向我們展示您嘗試過的最簡單,完整,可驗證的例子。 – user161778

回答

1

這是一個偉大的用例爲collections.Counter ...

from collections import Counter 
tup = ([(5,2),(7,2)], [(5,1),(7,3),(11,1)]) 
counts = sum((Counter(dict(sublist)) for sublist in tup), Counter()) 
result = list(counts.items()) 
print(result) 

一個缺點是,你將失去的輸入順序。他們出現通過鍵進行排序,所以你可以只對項目進行排序:

result = sorted(counts.items()) 

一個Counter是一本字典,其目的是保持垃圾桶的「罪狀」。計數巧妙地設計,以便您可以簡單地將它們加在一起(它將計數「bin-wise」相加 - 如果在兩個計數器中不存在bin,則缺少的bin的值被假定爲0)。所以,這解釋了爲什麼我們可以在一堆計數器上使用sum來獲取具有所需值的字典。不幸的是,這種解決方案,一個Counter不能使用能產生像正常映射2項序列可迭代實例化...,

Counter([(1, 2), (3, 4)]) 

將創建一個Counter連鍵(1, 2)(3, 4) - 這兩個值將會爲1。它的工作,如果你有一個卻映射創建爲預期:

Counter(dict([(1, 2), (3, 4)])) 

創建具有鍵13一個Counter(和值24)。

1

嘗試驗證碼(蠻力,可以是..)

dt = {} 
tp = ([(5,2),(7,2)],[(5,1),(7,3),(11,1)]) 
for ls in tp: 
    for t in ls: 
    dt[t[0]] = dt[t[0]] + t[1] if t[0] in dt else t[1] 
print dt.items() 

這裏採用的方法是遍歷元組的列表和元組的數據存儲爲一個字典,其中,所述元組t[0]中的第一個元素是key,第二個元素t[1]value
迭代時,每次在元組的第一個元素中找到相同的鍵時,將該值與元組的第二個元素相加。最後,我們將根據需要提供包含所有key,value對的字典dt。將這個字典轉換爲元組列表dt.items(),我們有我們的輸出。

+0

可否請您進一步解釋? –

+0

@zaolee_dragon:在答案中更新瞭解釋。 –