使用 Python 将键分组到值列表

pythonserver side programmingprogramming

将键分组到值是根据特定属性或标准对数据进行分类的过程。例如,假设您有一个学生数据集,并且您想按他们的成绩对他们进行分组。这种分组使我们能够轻松地对每个类别分别进行分析和计算。在 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 字典中的键项目关联的列表中。通过使用方括号 [] 和 groups[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,这是一个功能强大的函数,允许基于键函数进行分组。


相关文章