2011-12-02 51 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'}