Python - 字典中分组相似键


在 Python 中,可以使用多种方法对字典中的相似键进行分组,例如使用 defaultdict、使用列表字典、使用 itertools 模块以及 groupby 函数。在数据分析过程中,我们有时可能需要根据某些条件将字典中相似键组合在一起。在本文中,我们将探讨在字典中分组相似键的各种方法。

方法 1:使用 defaultdict

Python 的 collections 模块中的 defaultdict 类提供了一种方便的方法来对相似键进行分组。当访问新键时,它会自动初始化一个默认值。

语法

groups = defaultdict(list)
groups[item].append(item)

这里,collections 模块中的 defaultdict() 函数创建了一个最初包含空列表的组。groups[item].append(item) 方法使用键 (item) 访问与 groups 字典中该键关联的列表,并将 item 附加到该列表。

示例

在下面的示例中,我们创建了一个名为 grouped_dict 的 defaultdict 对象,其默认值为列表。我们遍历每个键值对,并将键附加到 grouped_dict 中相应的列表。最后,我们使用 dict() 函数将 defaultdict 转换为常规字典。

from collections import defaultdict

def group_keys_defaultdict(keys):
    grouped_dict = defaultdict(list)
    for key in keys:
        grouped_dict[key[0]].append(key)
    return dict(grouped_dict)

keys = [('A', 1), ('B', 2), ('A', 3), ('C', 4), ('B', 5)]
grouped_dict = group_keys_defaultdict(keys)
print(grouped_dict)

输出

{'A': [('A', 1), ('A', 3)], 'B': [('B', 2), ('B', 5)], 'C': [('C', 4)]}

方法 2:使用列表字典

我们可以手动创建一个空字典,并遍历键以通过为每个键创建列表来对它们进行分组。

语法

list_name.append(element)

这里,append() 函数是用于将元素添加到 list_name 末尾的列表方法。它通过将指定元素作为新项目添加到列表中来修改原始列表。

示例

在下面的示例中,我们初始化一个名为 grouped_dict 的空字典。对于每个键值对,我们检查该键是否已存在于字典中。如果不存在,则为该键创建一个空列表作为值。然后,我们将当前键附加到列表中。这样,我们就将相似的键组合在一起。

def group_keys_dict_of_lists(keys):
    grouped_dict = {}
    for key in keys:
        if key[0] not in grouped_dict:
            grouped_dict[key[0]] = []
        grouped_dict[key[0]].append(key)
    return grouped_dict

keys = [('A', 1), ('B', 2), ('A', 3), ('C', 4), ('B', 5)]
grouped_dict = group_keys_dict_of_lists(keys)
print(grouped_dict)

输出

{'A': [('A', 1), ('A', 3)], 'B': [('B', 2), ('B', 5)], 'C': [('C', 4)]}

方法 3:使用 itertools 模块中的 GroupBy 函数

我们可以使用 itertools 模块中的 groupby() 函数对相似键进行分组。它根据键函数对连续元素进行分组。

语法

list_name.append(element)

这里,append() 函数是用于将元素添加到 list_name 末尾的列表方法。它通过将指定元素作为新项目添加到列表中来修改原始列表。

itertools.groupby(iterable, key=None)

这里,iterable 可以是任何元素组或集合,key 是一个可选参数,用于确定将应用哪个分组标准。如果未传递 key,则其默认值为 None。

示例

在下面的示例中,我们首先使用 lambda 函数作为键函数,根据每个元组的第一个元素对键进行排序。然后,我们使用 groupby() 遍历排序后的键。对于每个组,键和组本身分别存储在单独的变量中。我们将该组转换为列表,并将其与相应的键一起存储在 grouped_dict 中。

from itertools import groupby

def group_keys_itertools(keys):
    grouped_dict = {}
    keys.sort(key=lambda x: x[0])
    for key, group in groupby(keys, lambda x: x[0]):
        grouped_dict[key] = list(group)
    return grouped_dict

keys = [('A', 1), ('B', 2), ('A', 3), ('C', 4), ('B', 5)]
grouped_dict = group_keys_itertools(keys)
print(grouped_dict)

输出

{'A': [('A', 1), ('A', 3)], 'B': [('B', 2), ('B', 5)], 'C': [('C', 4)]}

结论

在本文中,我们讨论了如何在 Python 中使用不同的方法对字典中的相似键进行分组。我们实现了三种方法:使用 defaultdict、创建列表字典以及利用 itertools 模块中的 groupby() 函数。每种方法都提供了一种独特的方法来实现所需的结果。通过有效地使用这些方法,您可以有效地对相似键进行分组,并以更结构化的方式组织您的数据。

更新于: 2023-07-19

2K+ 阅读量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告