gpt4 book ai didi

python - 合并多个字典,根据不同的值创建数组

转载 作者:行者123 更新时间:2023-12-04 02:36:40 25 4
gpt4 key购买 nike

所以我有一个包含多个词典的列表,它们都有相同的键。有些字典是相同的,但有一个值不同。我如何将它们合并到 1 个具有不同值作为数组的字典中?

举个例子:

假设我有这本字典

[{'a':1, 'b':2,'c':3},{'a':1, 'b':2,'c':4},{'a':1, 'b':3,'c':3},{'a':1, 'b':3,'c':4}]

我想要的输出是这样的:

[{'a':1, 'b':2,'c':[3,4]},{'a':1, 'b':3,'c':[3,4]}]

我试过使用 forif 嵌套,但它太昂贵而且很讨厌,我相信一定有更好的方法。你能帮我一下吗?

假设字典中键的数量相同并且知道要合并为数组的键的名称(在本例中为 c),我怎么能对任何类型的字典执行此操作

谢谢!

最佳答案

使用 collections.defaultdict通过 ab 元组键对 c 值进行分组:

from collections import defaultdict

lst = [
{"a": 1, "b": 2, "c": 3},
{"a": 1, "b": 2, "c": 4},
{"a": 1, "b": 3, "c": 3},
{"a": 1, "b": 3, "c": 4},
]

d = defaultdict(list)
for x in lst:
d[x["a"], x["b"]].append(x["c"])

result = [{"a": a, "b": b, "c": c} for (a, b), c in d.items()]

print(result)

也可以使用 itertools.groupby如果 lst 已经被 ab 排序:

from itertools import groupby
from operator import itemgetter

lst = [
{"a": 1, "b": 2, "c": 3},
{"a": 1, "b": 2, "c": 4},
{"a": 1, "b": 3, "c": 3},
{"a": 1, "b": 3, "c": 4},
]

result = [
{"a": a, "b": b, "c": [x["c"] for x in g]}
for (a, b), g in groupby(lst, key=itemgetter("a", "b"))
]

print(result)

或者如果 lst 不是按 ab 排序的,我们也可以按这两个键排序:

result = [
{"a": a, "b": b, "c": [x["c"] for x in g]}
for (a, b), g in groupby(
sorted(lst, key=itemgetter("a", "b")), key=itemgetter("a", "b")
)
]

print(result)

输出:

[{'a': 1, 'b': 2, 'c': [3, 4]}, {'a': 1, 'b': 3, 'c': [3, 4]}]

更新

对于任意数量的键的更通用的解决方案:

def merge_lst_dicts(lst, keys, merge_key):
groups = defaultdict(list)

for item in lst:
key = tuple(item.get(k) for k in keys)
groups[key].append(item.get(merge_key))

return [
{**dict(zip(keys, group_key)), **{merge_key: merged_values}}
for group_key, merged_values in groups.items()
]

print(merge_lst_dicts(lst, ["a", "b"], "c"))
# [{'a': 1, 'b': 2, 'c': [3, 4]}, {'a': 1, 'b': 3, 'c': [3, 4]}]

关于python - 合并多个字典,根据不同的值创建数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61522699/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com