使用 Python 将键分组到值列表中


将键分组到值的过程是根据特定属性或标准对数据进行分类的过程。例如,假设您有一个学生数据集,并且您希望按其成绩对他们进行分组。这种分组使我们能够轻松地分别分析和对每个类别执行计算。在 Python 中,我们可以通过多种方式将键分组到值列表中,例如使用字典、defaultdictitertools.groupby。在本文中,我们将了解如何使用这些方法将键分组到值列表中。

方法 1:使用字典

我们可以使用 Python 中的字典轻松地将键分组到值。让我们考虑一个示例,其中我们有一个水果列表,并且我们希望根据其颜色对它们进行分组。

语法

list_name.append(element)

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

示例

在下面的示例中,我们遍历水果列表并提取每个水果的颜色。然后,我们检查颜色是否已存在于 grouped_fruits 字典中。如果存在,我们将水果附加到该颜色的现有水果列表中。否则,我们将使用当前水果创建一个新列表,并将其分配给相应的颜色。

fruits = [
    {"name": "Apple", "color": "Red"},
    {"name": "Banana", "color": "Yellow"},
    {"name": "Grapes", "color": "Green"},
    {"name": "Orange", "color": "Orange"},
    {"name": "Blueberry", "color": "Blue"},
    {"name": "Strawberry", "color": "Red"},
]

grouped_fruits = {}

for fruit in fruits:
    color = fruit["color"]
    if color in grouped_fruits:
        grouped_fruits[color].append(fruit)
    else:
        grouped_fruits[color] = [fruit]

print(grouped_fruits)

输出

{
    'Red': [{'name': 'Apple', 'color': 'Red'}, {'name': 'Strawberry', 'color': 'Red'}],
    'Yellow': [{'name': 'Banana', 'color': 'Yellow'}],
    'Green': [{'name': 'Grapes', 'color': 'Green'}],
    'Orange': [{'name': 'Orange', 'color': 'Orange'}],
    'Blue': [{'name': 'Blueberry', 'color': 'Blue'}]
}

方法 2:使用 defaultdict 进行分组

我们可以使用 Python collections 模块中的 defaultdict 实现更有效的解决方案。defaultdict 会自动为不存在的键初始化一个值,从而使我们无需显式检查和创建列表。

语法

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

这里,defaultdict(list) 使用 collections 模块中的 defaultdict 类创建了一个名为 groups 的类似字典的对象。groups[item].append(item) 将一个项目附加到与 groups 字典中键 item 关联的列表中。通过使用方括号 [] 使用 groups[item] 访问字典,它会在键 item 已存在的情况下检索现有列表,或者在第一次遇到 item 时创建一个新的空列表作为值。

示例

在下面的示例中,我们创建了一个名为grouped_fruitsdefaultdict,其默认值使用defaultdict(list) 设置为空列表。现在,无论何时我们访问不存在的键,它都会自动将空列表初始化为值。这简化了分组过程,因为我们不需要单独处理键的存在。

from collections import defaultdict
fruits = [
    {"name": "Apple", "color": "Red"},
    {"name": "Banana", "color": "Yellow"},
    {"name": "Grapes", "color": "Green"},
    {"name": "Orange", "color": "Orange"},
    {"name": "Blueberry", "color": "Blue"},
    {"name": "Strawberry", "color": "Red"},
]

grouped_fruits = defaultdict(list)

for fruit in fruits:
    grouped_fruits[fruit["color"]].append(fruit)

print(dict(grouped_fruits))

输出

{
    'Red': [{'name': 'Apple', 'color': 'Red'}, {'name': 'Strawberry', 'color': 'Red'}],
    'Yellow': [{'name': 'Banana', 'color': 'Yellow'}],
    'Green': [{'name': 'Grapes', 'color': 'Green'}],
    'Orange': [{'name': 'Orange', 'color': 'Orange'}],
    'Blue': [{'name': 'Blueberry', 'color': 'Blue'}]
}

方法 3:使用 itertools.groupby 进行分组

我们可以使用 Python itertools 模块中的 groupby 函数轻松地将键分组到值。此函数允许我们根据键函数对可迭代对象中的元素进行分组。

语法

list_name.append(element)

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

itertools.groupby(iterable, key=None)

这里,groupby() 方法将可迭代对象作为输入,并带有一个可选的键函数。它返回一个迭代器,该迭代器生成包含可迭代对象中连续键和组的元组。键函数用于确定分组标准。

示例

在下面的示例中,我们定义了一个名为key_function 的键函数,该函数根据数字的奇偶性将其分类为“偶数”或“奇数”。然后,我们使用groupby 根据此键函数对数字进行分组。groupby 函数返回一个迭代器,该迭代器提供键和分组元素的迭代器。我们将迭代器转换为列表,并将其作为grouped_numbers 字典中的值。

from itertools import groupby

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

grouped_numbers = {}
key_function = lambda x: "Even" if x % 2 == 0 else "Odd"

for key, group in groupby(numbers, key_function):
    grouped_numbers[key] = list(group)

print(grouped_numbers)

输出

{'Odd': [9], 'Even': [10]}

结论

在本文中,我们讨论了如何在 Python 中使用不同的方法将键分组到值列表中。我们首先使用字典,其中我们手动检查键是否存在并创建列表作为值。然后,我们使用了 defaultdict,它通过自动为不存在的键初始化值来简化分组过程。此外,我们探讨了 itertools.groupby,这是一个强大的函数,允许根据键函数进行分组。

更新于:2023-07-17

2K+ 阅读量

启动您的 职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.