【问题标题】:Concatenating Unique Values from List of Dictionaries with sames Keys in Python在 Python 中连接具有相同键的字典列表中的唯一值
【发布时间】:2011-12-02 15:01:40
【问题描述】:

我正在处理一个字典列表,并试图将它们组合成一个符合以下条件的字典:

  1. 列表中的字典都有相同的键,新的字典也一样
  2. 如果所有字典中给定键的值相同,则该值将在新字典的值中出现一次
  3. 如果作为字典的给定键的值是唯一的,则新字典中该键的值将是所有值的逗号分隔字符串

所以我真正想做的是为多个字典中的给定键创建一个集合,并为新字典中的值创建该集合的逗号分隔字符串。为了帮助可视化,给出:

data = [ {"key1": "value1", "key2": "value2", "key3": "value3"},  
         {"key1": "value4", "key2": "value5", "key3": "value3"}, 
         {"key1": "value1", "key2": "value8", "key3": "value3"} ]

我想用如下数据制作一个新字典:

myDict = {"key1": "value1, value4", "key2": "value2, value5, value8", "key3": "value3"}

关于如何实现这一点的任何想法?

【问题讨论】:

    标签: python list dictionary python-3.x


    【解决方案1】:

    collections.defaultdict 是你的朋友。

    from collections import defaultdict
    temp_dict = defaultdict(set)
    for item in data:
       for key, value in item.items():
           temp_dict[key].add(value)
    

    这会给你一个{"key1": ["value1", "value4"]} 形式的字典 - 如果你想要实际的逗号分隔字符串作为值,那么你可以加入它们:

    my_dict = {}
    for key, value in temp_dict.items():
        my_dict[key] = ", ".join(value)
    

    【讨论】:

    • 我以前怎么没见过defaultdict?那是最正义的。来自我的 +1。
    • 也是非常酷的解决方案。与 nates 一起使用它稍微更直接,但这太棒了。谢谢!
    【解决方案2】:

    我在这里假设了两件事 - 值的顺序对您来说并不重要,并且您并不是要在每个字典中有两个相同的键(我已将其替换为 "key3"):

    >>> data = [ {"key1": "value1", "key2": "value2", "key3": "value3"},
    ...          {"key1": "value4", "key2": "value5", "key3": "value3"},
    ...          {"key1": "value1", "key2": "value8", "key3": "value3"} ]
    >>>
    >>> keylist = data[0].keys()
    >>> mydata = dict((k,', '.join(set(map(lambda d: d[k], data)))) for k in keylist)
    >>> mydata
    {'key3': 'value3', 'key2': 'value5, value2, value8', 'key1': 'value4, value1'}
    

    【讨论】:

      【解决方案3】:
      In [3]: from itertools import chain
      In [12]: dict([ (key, ",".join(set([elem[key] for elem in data]))) for key in set(list(chain(*[d.keys() for d in data])))])
      Out[12]: {'key1': 'value4,value1', 'key2': 'value5,value2,value8', 'key3': 'value3'}
      

      【讨论】:

        猜你喜欢
        • 2022-01-18
        • 2021-04-17
        • 2019-11-04
        • 2023-01-04
        • 1970-01-01
        • 1970-01-01
        • 2017-04-20
        • 1970-01-01
        • 2019-08-18
        相关资源
        最近更新 更多