堆叠字典列表

时间:2017-05-20 12:13:17

标签: python list python-3.x dictionary

我将一个字典列表合并到一个输出中时遇到了一些问题。

我有以下词典列表:

td

我想要跟随输出,以便" name"我把玩具和#34; s组合在一个领域。最终输出应为:

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

我如何在Python中实现这一目标?

2 个答案:

答案 0 :(得分: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.OrderedDict使用temp_store

答案 1 :(得分: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'}]

然而,因为中间字典是"无序"结果可以在Mum之前进行仲裁Andi。您可以使用collections.OrderedDict来确保正确的订购。然后使用我在第二个代码块中显示的方法来创建它。