2017-05-20 167 views
1

我被困在將一個詞典列表組合成一個輸出的小問題上。堆疊詞典列表

我有字典的以下列表:

listOfDicts = [{"name": "Andi", "toy": "puppet"}, {"name": "Andi", "toy": "monkey"},{"name": "Mum", "toy": "ape"}, {"name": "Mum", "toy": "sheep"}] 

,我想有下列輸出中,這樣的「名」我已經拿到了「玩具」 S組合在一個領域。最終輸出應爲:

finalDicts = [{"name": "Andi", "toy": "puppet, monkey"}, {"name": "Mum", "toy": "ape, sheep"}] 

我該如何在Python中實現這個功能?

+0

名稱的順序應該保持不變嗎? –

+0

我建議使用列表來存儲玩具,而不是一個逗號分隔的字符串。 – timgeb

回答

0

一個非常程序的方式來做到這將是:

temp_store = {} 
for element in listOfDicts: 
    temp_store[element["name"]] = temp_store.get(element["name"], []) + [element["toy"]] 
finalDicts = [{"name": element, "toy": ", ".join(temp_store[element])} for element in temp_store] 

可以使用collections.OrderedDicttemp_store,如果你想保持這個順序。

0

你可以使用collections.defaultdict收集物品:

from collections import defaultdict 
result = defaultdict(list) 
for dct in listOfDicts: 
    result[dct['name']].append(dct['toy']) 

print(result) 
# defaultdict(list, {'Andi': ['puppet', 'monkey'], 'Mum': ['ape', 'sheep']}) 

如果你不想做defaultdict,同樣可以用普通的字典來完成:

result = {} 
for dct in listOfDicts: 
    try: 
     result[dct['name']].append(dct['toy']) 
    except KeyError: 
     result[dct['name']] = [dct['toy']] 

然後你只需要從這些列表中創建一個列表和join列表:

resultlist = [{'name': key, 'toy': ', '.join(value)} for key, value in result.items()] 
print(resultlist) 
# [{'name': 'Andi', 'toy': 'puppet, monkey'}, {'name': 'Mum', 'toy': 'ape, sheep'}] 

但是因爲中級字典是「無序的」,所以可以在Andi之前對結果進行任意排序​​。您可以使用collections.OrderedDict來正確排序。然後,只需使用我在第二個代碼塊中顯示的方法來創建它。