python - 合并几个字典,在不同的值上创建数组
问题描述
所以我有一个包含几个字典的列表,它们都有相同的键。有些字典是相同的,但一个值是不同的。如何将它们合并到 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]}]
我试过使用for
和if
嵌套,但它太昂贵和讨厌,我相信一定有更好的方法。你能帮我一把吗?
c
假设字典上的键数量相同并且知道要合并为数组的键的名称(在这种情况下),我怎么能对任何类型的字典执行此操作
谢谢!
解决方案
使用 a按和元组键collections.defaultdict
对c
值进行分组:a
b
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
iflst
已经由a
and订购b
:
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
不是按a
andb
排序,我们也可以按这两个键排序:
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]}]
推荐阅读
- selenium - 在 Selenium Webdriver 中选择下拉值
- java - Value class to keep object type for later casting?
- azure - Is there a option to get the event grid trigger url + key at output value from the deployment of a Azure Function?
- node.js - How to exclude a field on save in node js
- amazon-web-services - Direct requests to a specific path based on the subdomain
- c# - Form display message when all items have been deleted from list
- c# - Error combining 'if' statements that null-checks and Pattern Matches
- r - finding each pattern ina set of sequences
- python - Numpy generate X random binary numbers with a define threshold in 1 line
- android - ArCore - 在会话上下文中创建锚点