📜  Python - 在字典列表中连接具有相同键的值(1)

📅  最后修改于: 2023-12-03 15:33:56.697000             🧑  作者: Mango

Python - 在字典列表中连接具有相同键的值

在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 内置的 defaultdictgroupby

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 中连接具有相同键的值。