Python 将两个字典中的值合并到一个列表中

Python 将两个字典中的值合并到一个列表中,python,list,dictionary,Python,List,Dictionary,在python中,如果我有两个字典,特别是计数器对象 c1 = Counter({'item1': 4, 'item2':2, 'item3': 5, 'item4': 3}) c2 = Counter({'item1': 6, 'item2':2, 'item3': 1, 'item5': 9}) 我是否可以合并这些词典,使结果成为列表词典,如下所示: c3 = {'item1': [4,6], 'item2':[2,2], 'item3': [5,1], 'item4': [3], 'it

在python中,如果我有两个字典,特别是计数器对象

c1 = Counter({'item1': 4, 'item2':2, 'item3': 5, 'item4': 3})
c2 = Counter({'item1': 6, 'item2':2, 'item3': 1, 'item5': 9})
我是否可以合并这些词典,使结果成为列表词典,如下所示:

c3 = {'item1': [4,6], 'item2':[2,2], 'item3': [5,1], 'item4': [3], 'item5': [9]}
如果每个值都是来自相应键的前面词典的所有值的列表,并且如果两个原始词典之间没有匹配键,则添加一个包含一个元素列表的新kew

from collections import Counter
c1 = Counter({'item1': 4, 'item2':2, 'item3': 5, 'item4': 3})
c2 = Counter({'item1': 6, 'item2':2, 'item3': 1, 'item5': 9})
c3 = {}
for c in (c1, c2):
    for k,v in c.iteritems():
        c3.setdefault(k, []).append(v)

c3
现在是:
{'item1':[4,6],'item2':[2,2],'item3':[5,1],'item4':[3],'item5':[9]}
或具有列表理解:

from collections import Counter
c1 = Counter({'item1': 4, 'item2':2, 'item3': 5, 'item4': 3})
c2 = Counter({'item1': 6, 'item2':2, 'item3': 1, 'item5': 9})
merged = {}
for k in set().union(c1, c2):
    merged[k] = [d[k] for d in [c1, c2] if k in d]

>>> merged
{'item2': [2, 2], 'item3': [5, 1], 'item1': [4, 6], 'item4': [3], 'item5': [9]}
解释
  • 将所有存在的密钥抛出到匿名集中。(这是一个集合=>没有重复的键)
  • 对于每个键,执行3
  • 对于字典列表中的每个字典d
    [c1,c2]
    • 检查当前正在处理的键
      k
      是否存在
      • 如果为true:在结果列表中包含表达式
        d[k]
      • 如果不是:继续下一次迭代

  • 是对列表理解的详细介绍,包括许多示例。

    您可以使用
    defaultdict

    >>> from collections import Counter, defaultdict
    >>> c1 = Counter({'item1': 4, 'item2':2, 'item3': 5, 'item4': 3})
    >>> c2 = Counter({'item1': 6, 'item2':2, 'item3': 1, 'item5': 9})
    >>> c3 = defaultdict(list)
    >>> for c in c1, c2:
    ...     for k, v in c.items():
    ...         c3[k].append(v)
    ... 
    >>> c3
    defaultdict(<type 'list'>, {'item2': [2, 2], 'item3': [5, 1], 'item1': [4, 6],
    'item4': [3], 'item5': [9]})
    
    >>来自集合导入计数器,defaultdict
    >>>c1=计数器({'item1':4,'item2':2,'item3':5,'item4':3})
    >>>c2=计数器({'item1':6,'item2':2,'item3':1,'item5':9})
    >>>c3=默认DICT(列表)
    >>>对于c1、c2中的c:
    ...     对于c.项()中的k,v:
    ...         c3[k]。追加(v)
    ... 
    >>>c3
    defaultdict(,{'item2':[2,2],'item3':[5,1],'item1':[4,6],
    'item4':[3],'item5':[9]})
    
    我尝试了这个方法,但是我得到了一个
    合并的[k]=[d[k]对于[c1,c2]中的d,如果k在d]类型错误:列表索引必须是整数,而不是str
    错误。我不明白它在做什么来修复它。我还没有真正掌握列表理解的窍门。@DavyKavanagh我的错误,当然是一本字典。@DavyKavanagh我已经添加了一个解释。--如果编辑了OP问题的答案,是否会通知OP?