2013-04-23 118 views
0

我有一个元素列表,其中每个元素是一种字典。我希望这个实现在Python中完成。在包含字典和返回字典的列表上操作

我的输入是这样的:

MyList = [{'Kathy':1, 'Bob':1, 'Spencer':1}, {'Kathy':4, 'Cynthia':2, 'Bob':3, 'Goldman':1}, {'Spencer':2, 'Bob':1}] 

我的输出应该是这样的:

MyDict = {'Kathy':5, 'Bob':5, 'Spencer':3, 'Cynthia':2, 'Goldman':1} 
+1

可能的重复[是否有任何pythonic的方式来结合两个字典(添加键出现在两个值)?](http://stackoverflow.com/questions/11011756/is-there-any-pythonic-way -to-combine-two-dicts-adding-values-for-keys-that-appe) – 2013-04-23 19:50:05

回答

2

使用Counter

>>> from collections import Counter 
>>> myList = [{'Kathy':1, 'Bob':1, 'Spencer':1}, {'Kathy':4, 'Cynthia':2, 'Bob':3, 'Goldman':1}, {'Spencer':2, 'Bob':1}] 
>>> myDict = Counter() 
>>> for d in myList: 
     myDict.update(d) 
>>> myDict 
Counter({'Kathy': 5, 'Bob': 5, 'Spencer': 3, 'Cynthia': 2, 'Goldman': 1}) 
0

下面是使用defaultdict做到这一点的一种方式。

import collections 

MyDict = collections.defaultdict(int) 
for d in MyList: 
    for k,v in d.items(): 
     MyDict[k] += v 
MyDict = dict(MyDict) #if you want a normal dict 

编辑:看起来像柜台版本更好。但是,如果您必须执行除添加整数之外的其他操作,那么了解defaultdicts仍然很重要。例如,它们可用于累积列表或集合。

-1

这里是这样做的另一种方式,似乎什么我一点比迄今所提供的方案更Python(但它更可能使用更多的内存,因为它不是基于发电机):

my_dict = {key: 0 
      for one_dict in list_of_dicts 
      for key in one_dict.keys()} 
my_dict = {key: one_dict[key]+my_dict[key] 
      for one_dict in list_of_dicts 
      for key in one_dict.keys()} 

编辑:谢谢@ ShadowRanger的洞察力,然而,在这种情况下,我宁愿使用.keys()选项来专门恢复密钥,而不是简单地遍历字典中的每个密钥对,因为密钥会需要将这样的密钥添加到最终字典中。

+0

你的理解是倒退的;你需要首先对'list_of_dicts'进行迭代,所以你有一个'one_dict'来重复第二个。此外,这不会总结任何值,只保留最后一个值,并且在Python 2中使用'.keys()'是浪费的,而没有获得任何东西(它会产生键的中间列表副本,直接迭代'dict'而不需要中间''list')。 – ShadowRanger 2016-01-28 13:26:29