📜  成组的导轨 - Python (1)

📅  最后修改于: 2023-12-03 14:54:22.707000             🧑  作者: Mango

成组的导轨 - Python

概述

成组的导轨(groupby)是一个 Python 的内置函数,可以按照特定的键对序列进行分组。顾名思义,成组的导轨会将同一组键值放在一起组成一个迭代器。可以将它看作是 SQL 语句中的 GROUP BY 功能的 Python 实现。

语法
itertools.groupby(iterable, key=None)
参数
  • iterable:可迭代对象,如列表、元组、字符串等;
  • key:可选参数,用于指定分组时所使用的键。
返回值

返回值是一个可迭代对象,包含了二元组 (key, group),其中 key 是分组的键,也就是成组的标准,group 是分组的元素,是一个迭代器。

范例

我们来看一个示例。假设我们有如下一个列表:

lst = [1, 2, 2, 3, 2, 4, 4, 5, 5, 5]

现在我们希望将相邻且相同的数字分组在一起。我们可以使用成组的导轨函数来实现:

import itertools

grouped = itertools.groupby(lst)

for key, group in grouped:
    print(key, list(group))

输出:

1 [1]
2 [2]
3 [3]
2 [2]
4 [4]
5 [5]

注意,成组的导轨函数仅会将相邻且相同的元素分成一组。为了对列表中的所有元素进行分组,我们需要在应用成组的导轨之前将列表先排序:

import itertools

lst = [1, 2, 2, 3, 2, 4, 4, 5, 5, 5]
lst.sort()

grouped = itertools.groupby(lst)

for key, group in grouped:
    print(key, list(group))

输出:

1 [1]
2 [2, 2, 2]
3 [3]
4 [4, 4]
5 [5, 5, 5]
自定义键

默认情况下,成组的导轨函数以元素的值作为分组的键。如果我们希望根据元素的其他属性进行分组,则需要自定义分组时使用的键。我们可以通过 key 参数指定一个函数来进行自定义分组。 下面我们来看一个示例。假设有一个由名称、性别和年龄构成的元组列表:

lst = [('Tom', 'M', 25), ('Lucy', 'F', 22), ('Andy', 'M', 26), ('Lily', 'F', 23), ('Jack', 'M', 25)]

如果我们希望将同一性别的人员分组,可以使用下面的代码:

import itertools

lst = [('Tom', 'M', 25), ('Lucy', 'F', 22), ('Andy', 'M', 26), ('Lily', 'F', 23), ('Jack', 'M', 25)]

def gender_key(person):
    return person[1]

grouped = itertools.groupby(sorted(lst, key=gender_key), key=gender_key)

for key, group in grouped:
    print(key, list(group))

输出:

F [('Lucy', 'F', 22), ('Lily', 'F', 23)]
M [('Tom', 'M', 25), ('Andy', 'M', 26), ('Jack', 'M', 25)]

在这个例子中,我们自定义了一个 gender_key 函数,用于指定按照性别进行分组。然后在应用成组的导轨函数时,我们将这个函数作为 key 参数传入。