【问题标题】:Combining the values in two dictionaries into a list将两个字典中的值组合成一个列表
【发布时间】:2012-07-24 13:41:43
【问题描述】:

在 python 中,如果我有两个字典,特别是看起来像这样的 Counter 对象

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。

【问题讨论】:

    标签: python list dictionary


    【解决方案1】:
    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]}

    【讨论】:

      【解决方案2】:

      或者使用列表理解:

      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]}
      

      说明

      1. 将所有存在的密钥放入匿名集中。 (这是一个集合 => 没有重复的键)
      2. 对于每个键,执行 3。
      3. 对于字典列表中的每个字典 d [c1, c2]
        • 检查当前正在处理的keyk是否存在
          • 如果为真:在结果列表中包含表达式 d[k]
          • 如果不是:继续下一次迭代

      Here 是对列表理解的详细介绍,并附有许多示例。

      【讨论】:

      • 我试过了,但我收到了merged[k] = [d[k] for d in [c1, c2] if k in d] TypeError: list indices must be integers, not str 错误。我不明白它在做什么才能修复它。我还没有真正了解列表推导。
      • @DavyKavanagh 我的错,合并当然必须是字典。
      • @DavyKavanagh 我已经添加了解释。 -- 如果他的问题的答案被编辑,OP 是否会收到通知?
      【解决方案3】:

      你可以使用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]})
      

      【讨论】:

        猜你喜欢
        • 2018-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-06
        • 1970-01-01
        • 1970-01-01
        • 2023-02-18
        • 1970-01-01
        相关资源
        最近更新 更多