ZetCode

Python itertools groupby

最后修改于 2025 年 2 月 25 日

Python itertools 模块中的 groupby 函数用于根据键函数对数据进行分组。它尤其适用于将排序后的数据分组到有意义的类别中。本教程将通过实际示例介绍如何使用 groupby

groupby 函数要求数据必须按照用于分组的相同键进行排序。它返回一个迭代器,该迭代器会生成可迭代对象中的连续键和组。

基本分组

此示例演示如何按单个键对数据进行分组。

basic_groupby.py
from itertools import groupby

# Dataset
data = [
    {'Adventurer': 'Lara', 'Region': 'Forest', 'Treasure': 'Gems', 'Quantity': 5, 'Danger_Level': 'Medium'},
    {'Adventurer': 'Indy', 'Region': 'Desert', 'Treasure': 'Gold', 'Quantity': 10, 'Danger_Level': 'High'},
    {'Adventurer': 'Nathan', 'Region': 'Mountain', 'Treasure': 'Relics', 'Quantity': 3, 'Danger_Level': 'Low'},
    {'Adventurer': 'Lara', 'Region': 'Mountain', 'Treasure': 'Relics', 'Quantity': 8, 'Danger_Level': 'High'},
    {'Adventurer': 'Indy', 'Region': 'Desert', 'Treasure': 'Gold', 'Quantity': 15, 'Danger_Level': 'High'},
    {'Adventurer': 'Nathan', 'Region': 'Forest', 'Treasure': 'Gems', 'Quantity': 4, 'Danger_Level': 'Medium'},
    {'Adventurer': 'Elena', 'Region': 'Mountain', 'Treasure': 'Relics', 'Quantity': 6, 'Danger_Level': 'Low'},
    {'Adventurer': 'Lara', 'Region': 'Desert', 'Treasure': 'Gold', 'Quantity': 12, 'Danger_Level': 'Medium'}
]

# Sort data by Adventurer
data.sort(key=lambda x: x["Adventurer"])

# Group by Adventurer
for key, group in groupby(data, key=lambda x: x["Adventurer"]):
    print(f"Adventurer: {key}")
    for item in group:
        print(item)
    print()

groupby 函数按 Adventurer 键对数据进行分组。数据首先按相同的键进行排序,以确保正确分组。

按多个键分组

此示例演示如何按多个键对数据进行分组。

groupby_multiple_keys.py
from itertools import groupby
from operator import itemgetter

# Dataset
data = [
    {'Adventurer': 'Lara', 'Region': 'Forest', 'Treasure': 'Gems', 'Quantity': 5, 'Danger_Level': 'Medium'},
    {'Adventurer': 'Indy', 'Region': 'Desert', 'Treasure': 'Gold', 'Quantity': 10, 'Danger_Level': 'High'},
    {'Adventurer': 'Nathan', 'Region': 'Mountain', 'Treasure': 'Relics', 'Quantity': 3, 'Danger_Level': 'Low'},
    {'Adventurer': 'Lara', 'Region': 'Mountain', 'Treasure': 'Relics', 'Quantity': 8, 'Danger_Level': 'High'},
    {'Adventurer': 'Indy', 'Region': 'Desert', 'Treasure': 'Gold', 'Quantity': 15, 'Danger_Level': 'High'},
    {'Adventurer': 'Nathan', 'Region': 'Forest', 'Treasure': 'Gems', 'Quantity': 4, 'Danger_Level': 'Medium'},
    {'Adventurer': 'Elena', 'Region': 'Mountain', 'Treasure': 'Relics', 'Quantity': 6, 'Danger_Level': 'Low'},
    {'Adventurer': 'Lara', 'Region': 'Desert', 'Treasure': 'Gold', 'Quantity': 12, 'Danger_Level': 'Medium'}
]

# Sort data by Region and Danger_Level
data.sort(key=itemgetter("Region", "Danger_Level"))

# Group by Region and Danger_Level
for key, group in groupby(data, key=itemgetter("Region", "Danger_Level")):
    print(f"Region: {key[0]}, Danger Level: {key[1]}")
    for item in group:
        print(item)
    print()

groupby 函数根据指定的键对数据集中的项进行分组。for 循环遍历每个组,每个组由一个键和一个包含该组中项的迭代器组成。在循环内部,数据按 Adventurer 键进行分组。数据首先按相同的键进行排序,以确保正确分组。

聚合分组数据

此示例演示如何在每个组内聚合数据。

aggregate_groupby.py
from itertools import groupby

# Dataset
data = [
    {'Adventurer': 'Lara', 'Region': 'Forest', 'Treasure': 'Gems', 'Quantity': 5, 'Danger_Level': 'Medium'},
    {'Adventurer': 'Indy', 'Region': 'Desert', 'Treasure': 'Gold', 'Quantity': 10, 'Danger_Level': 'High'},
    {'Adventurer': 'Nathan', 'Region': 'Mountain', 'Treasure': 'Relics', 'Quantity': 3, 'Danger_Level': 'Low'},
    {'Adventurer': 'Lara', 'Region': 'Mountain', 'Treasure': 'Relics', 'Quantity': 8, 'Danger_Level': 'High'},
    {'Adventurer': 'Indy', 'Region': 'Desert', 'Treasure': 'Gold', 'Quantity': 15, 'Danger_Level': 'High'},
    {'Adventurer': 'Nathan', 'Region': 'Forest', 'Treasure': 'Gems', 'Quantity': 4, 'Danger_Level': 'Medium'},
    {'Adventurer': 'Elena', 'Region': 'Mountain', 'Treasure': 'Relics', 'Quantity': 6, 'Danger_Level': 'Low'},
    {'Adventurer': 'Lara', 'Region': 'Desert', 'Treasure': 'Gold', 'Quantity': 12, 'Danger_Level': 'Medium'}
]

# Sort data by Treasure
data.sort(key=lambda x: x["Treasure"])

# Group by Treasure and calculate total Quantity
for key, group in groupby(data, key=lambda x: x["Treasure"]):
    total_quantity = sum(item["Quantity"] for item in group)
    print(f"Treasure: {key}, Total Quantity: {total_quantity}")

groupby 函数按 Treasure 对数据进行分组,并使用 sum 函数计算每种宝藏类型的总量。

使用 groupby 的最佳实践

来源

Python itertools groupby 文档

在本文中,我们探讨了如何使用 Python itertools 模块中的 groupby 函数对数据进行分组和聚合。

作者

我叫 Jan Bodnar,是一名充满热情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 Python 教程