2011-12-02 38 views
0

我与词典列表的工作,我试图将它们与下列条件组合成一个:串联从字典的名单独特价值与萨姆斯键在Python

  1. 的词典列表中的所有有相同的密钥和新的字典
  2. 如果所有字典中给定键的值相同,则该值将在新字典的值中出现一次
  3. 如果给定键的值作为字典是独一无二的,那么新字典中的那个键的价值将是逗号分隔的字符串l值

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

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

我在这里假定两件事情 - 这些值的顺序是不是对你很重要,而且你并不想有两个在每个字典相同的密钥(这我已经与"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'} 
+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) 
+0

我从来没有见过'defaultdict'之前?这是最正确的。从我+1。 – Nate

+0

非常酷的解决方案。以更直接的方式与nates进行了比赛,但这非常棒。谢谢! –

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