📅  最后修改于: 2023-12-03 15:33:56.697000             🧑  作者: Mango
在Python中,我们经常需要从多个字典列表中提取信息并根据键值连接相同的项。这样的操作可以用来对数据进行清理和分析。
考虑下面的示例字典列表:
data = [
{"name": "Alice", "age": 25, "city": "New York"},
{"name": "Bob", "age": 30, "city": "Los Angeles"},
{"name": "Charlie", "age": 35, "city": "Chicago"},
{"name": "Alice", "age": 40, "city": "San Francisco"},
{"name": "Bob", "age": 45, "city": "Boston"},
]
我们可以将这个字典列表根据 name
键值连接相同的项,使得结果长成这个样子:
{
"Alice": [{"age": 25, "city": "New York"}, {"age": 40, "city": "San Francisco"}],
"Bob": [{"age": 30, "city": "Los Angeles"}, {"age": 45, "city": "Boston"}],
"Charlie": [{"age": 35, "city": "Chicago"}],
}
要实现这个目标,可以使用 Python 内置的 defaultdict
和 groupby
。
from collections import defaultdict
from itertools import groupby
def group_by_key(items, key):
# 先根据 key 排序,这是 groupby 的要求
items = sorted(items, key=lambda x: x[key])
# 创建一个 defaultdict,value 为 list
result = defaultdict(list)
# 使用 groupby 进行分组
for k, g in groupby(items, lambda x: x[key]):
# g 是一个迭代器,内部存储的是相同 key 的字典
result[k] = list(g)
return result
result = group_by_key(data, "name")
print(result)
输出为:
{
"Alice": [{"name": "Alice", "age": 25, "city": "New York"}, {"name": "Alice", "age": 40, "city": "San Francisco"}],
"Bob": [{"name": "Bob", "age": 30, "city": "Los Angeles"}, {"name": "Bob", "age": 45, "city": "Boston"}],
"Charlie": [{"name": "Charlie", "age": 35, "city": "Chicago"}],
}
然而,结果并不是我们期望的。这是因为 groupby
返回的是一个迭代器,里面存储的是相同的键值的元组。因此,我们需要将 g
转换为列表。这就是为什么在 groupby
之后,我们需要使用 list(g)
对 g
转换一下。
最终的结果看起来是这样的:
{
"Alice": [{"age": 25, "city": "New York"}, {"age": 40, "city": "San Francisco"}],
"Bob": [{"age": 30, "city": "Los Angeles"}, {"age": 45, "city": "Boston"}],
"Charlie": [{"age": 35, "city": "Chicago"}],
}
以上就是如何在 Python 中连接具有相同键的值。