📅  最后修改于: 2023-12-03 14:54:22.707000             🧑  作者: Mango
成组的导轨(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
参数传入。