从Python中使用相同键的字典列表连接唯一值

时间:2011-12-02 15:01:40

标签: python list dictionary python-3.x

我正在处理一个词典列表,并尝试将它们组合成一个具有以下条件的词典:

  1. 列表中的词典都具有相同的键,新词典也将
  2. 如果所有词典中给定键的值相同,则该值将在新词典的值中出现一次
  3. 如果作为词典的给定键的值是唯一的,则新词典中该键的值将是所有值的逗号分隔字符串
  4. 所以我真正要做的是为多个字典中的给定键创建一个集合,并为新字典中的值创建该集合的逗号分隔字符串。为了帮助可视化,给出:

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

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

3 个答案:

答案 0 :(得分:5)

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)

答案 1 :(得分:3)

我在这里假定了两件事 - 值的顺序对你来说并不重要,并且你并不是说在每个字典中都有两个相同的键(我用"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'}

答案 2 :(得分:1)

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