2016-04-14 61 views
0

我有兩個列表使用詞典:如何用兩個列表中的同一個鍵來求和字典值?

rich = [ 
    {'currency': 'USD', 'value': 100}, 
    {'currency': 'EUR', 'value': 110}, 
    {'currency': 'USD', 'value': 120}, 
    {'currency': 'GBP', 'value': 130}, 
] 

poor = [ 
    {'currency': 'USD', 'value': 10}, 
    {'currency': 'AED', 'value': 20}, 
] 

我怎麼能結合兩種這樣我就可以得到:

rich_and_poor = [ 
    {'currency': 'USD', 'value': 110}, # +10 
    {'currency': 'EUR', 'value': 110}, 
    {'currency': 'GBP', 'value': 130}, 
    {'currency': 'AED', 'value': 20} # new dictionary 
] 

from collections import Counter是有用的,因爲它可以用相同的鍵來求和字典值,但我仍然不知道如何用dictionairies列表來做到這一點。

x = {'value': 123} 
y = {'value': 2} 

Counter(x) + Counter(y) = {'value': 125} 
+0

列表中的項目不起作用? – biniow

+1

你有兩倍豐富的美元是正確的嗎? – Noelkd

+0

正如@Noelkd指出的那樣,它是否預期在單一來源列表中有重複的貨幣? –

回答

1

更合乎邏輯的結構是有一個字典,貨幣作爲鍵和值作爲值。讓我們用一個defaultdict創建一個(讓新密鑰自動開始時爲0):

currencies = defaultdict(int) 

現在添加您的類型的字典給它:

for currencydict in rich + poor: 
    currencies[currencydict['currency']] += currencydict['value'] 

這產生了類似的信息(不一定是相同的順序):

{ 
    'USD': 230, 
    'EUR': 110, 
    'GBP': 130, 
    'AED': 20 
} 

而現在,如果你真的有必要,將其轉換回像您這樣的名單:

rich_and_poor = [{'currency': key, 'value': value} for key, value in currencies.items()] 
+0

哇我在我的文本編輯器中有這個代碼只是等待迴應我的問題! – Noelkd

+1

我做了map(lambda dp:{「currency」:dp [0],「value」:dp [1]},rich_and_poor.iteritems())'把它放回正確的形狀 – Noelkd

+0

是的,問題,我只是假設這是一個錯誤,如果不是那麼我認爲無論如何都存在一個XY問題,因爲那時數據看起來更奇怪。 – RemcoGerlich

相關問題