2016-02-24 77 views
2

这是迄今为止我试图查看具有相同密钥的三个字典并添加其相应值的代码。如果没有密钥存在,我希望代码添加一个零。在Python中合并相同密钥的字典

#!/usr/bin/env python 
import sys 
from operator import itemgetter 
import csv 
import ast 
from collections import defaultdict 

super_dic={} 
d1 = {'a':2, 'b':5, 'c':3, 'd':6} 
d2 = {'a':3, 'c':3} 
d3 = {'b':4, 'd':4} 

for d in (d1, d2, d3): 
    for key, value in d.iteritems(): 
    super_dic.setdefault(key, []).append(value) 
print super_dic 

输出的super_dic建:

{'a': [2, 3], 'c': [3, 3], 'b': [5, 4], 'd': [6, 4]} 

不过,我想我的最终结果是:

{'a':[2, 3, 0], 'c':[3,3,0], 'b':[5,0,4],'d':[6,0,4]} 

值的顺序事项

任何帮助/反馈都是muc h赞赏。已经争取了一段时间,所有尝试的方法都没有在最后建立正确的主字典。

*请注意,这不是一个重复的问题,因为在Python中合并字典时出现的问题都忽略了如果密钥项不存在,则添加。 *

+0

您是否需要将值列表与原始字典的顺序相同,或者是否足够使[5,4,0]而不是[5,0,4]? – Prune

+0

@Prune订单很重要。我将这个添加到我的问题,所以它明确 – user5927494

+0

@timgeb一个投了+4解决了我的问题!非常感谢。走在前面,并将其标记为答案 – user5927494

回答

5

为了更一般化,我们假设您有一个名为dicts的字典列表。

>>> dicts = [d1, d2, d3] 
>>> allkeys = set(x for d in dicts for x in d.keys())  
>>> super_dic = {k:[d.get(k, 0) for d in dicts] for k in allkeys} 
>>> super_dic 
{'a': [2, 3, 0], 'c': [3, 3, 0], 'b': [5, 0, 4], 'd': [6, 0, 4]} 
+0

非常好的答案。我只想补充一点,在这种情况下,如果d1已经包含所有密钥,则可以跳过创建'allkeys'集并仅使用d1.keys()代替allkeys: 'super_dic = {k:[d.get (k,0)for d in dicts] for k in d1.keys()}' – JLT

0

我发现了一个有点(尴尬)解决方案:

from collections import defaultdict 

super_dic={} 
d1 = {'a':2, 'b':5, 'c':3, 'd':6} 
d2 = {'a':3, 'c':3} 
d3 = {'b':4, 'd':4} 

# Counter because it might be that there is some element only present in a later dict. 
# And we need to compare the current list lengths in each turn 
i = 0 
for d in (d1, d2, d3): 
    for key in d: 
     # It might be that a key wasn't present before so set default to [0]*i 
     super_dic.setdefault(key, [0]*i).append(d[key]) 
    # Increment i so we can compare the list lengths: 
    i += 1 
    # Append 0 for every key that wasn't appended in this turn: 
    for key in super_dic: 
     if len(super_dic[key]) < i: 
      super_dic[key].append(0) 
print(super_dic) 

{'b': [5, 0, 4], 'a': [2, 3, 0], 'd': [6, 0, 4], 'c': [3, 3, 0]} 

的解释是内部的代码注释我希望这是可以理解的,否则我会进一步阐述他们。只是评论,如果有什么不清楚。

1

我不喜欢这样。获取一组中的所有密钥,使用列表功能创建一个defaultdict。然后迭代所有字典的所有密钥。

all_keys = set(d1).union(d2).union(d3) 

merged_dict = defaultdict(list) 
for d in (d1,d2,d3): 
    for key in all_keys: 
     merged_dict[key] += d.get(key, 0), 

print merged_dict 
相关问题