2016-04-14 46 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

相关问题