Python groupby()切分迭代器

  • Post category:Python

下面是关于 Python 中 groupby() 函数的详细讲解。

1. 什么是groupby()函数?

groupby() 函数是Python标准库中的一个内建函数,用于将迭代器中连续的元素按照指定的键值 进行分组。

具体来说,groupby() 函数可以将一个可迭代对象中相邻、相等的元素划分为一个组,这些组都具有相同的键值。除了返回组的迭代器之外, groupby() 函数还会返回每个组对应的键值。

2. groupby()函数的使用方法

2.1 语法

groupby() 函数的基本语法如下所示:

itertools.groupby(iterable, key=None)

其中,参数 iterable 指定了要进行分组的可迭代对象, key 参数用于指定分组的依据,如果不指定,则默认按照元素的值进行分组。

groupby() 函数会返回一个迭代器,每个迭代器元素都是一个元组,包含了分组后的键值和对应的一组元素,如下所示:

# 示意
(key1, group1), (key2, group2), ..., (keyN, groupN)

其中, key1keyN 分别为不同的键值, group1groupN 分别为对应的一组元素。

2.2 示例

下面是一些实例来帮助理解 groupby() 函数的使用方法:

示例 1. 简单分组

我们先来看一个简单的示例,假设我们有一个字符串序列,希望将其中连续的重复元素分成一组,然后计算每组中元素的个数,代码如下所示:

import itertools

data = 'AABBCCCCADDDEEE'
groups = itertools.groupby(data)

# 遍历所有分组,并打印分组结果
for key, group in groups:
    print(key, len(list(group)))

程序输出结果如下所示:

A 2
B 2
C 4
A 1
D 3
E 3

在上面的示例中,我们使用 groupby() 函数来对字符串序列进行分组,然后遍历所有的分组,计算每组中元素的个数。

示例 2. 分组依据

我们再来看一个示例,假设我们有一个包含多个元组的序列,每个元组都有两个字段,我们希望按照第一个字段的值对元组进行分组,代码如下所示:

import itertools

data = [
    ('apple', 3), 
    ('banana', 2), 
    ('orange', 4), 
    ('banana', 1), 
    ('orange', 3), 
]

# 按照第一个字段的值来分组
groups = itertools.groupby(data, lambda x: x[0])

# 遍历所有分组,并打印分组结果
for key, group in groups:
    print(key, list(group))

程序输出结果如下所示:

apple [('apple', 3)]
banana [('banana', 2), ('banana', 1)]
orange [('orange', 4), ('orange', 3)]

在上面示例中,我们使用 groupby() 函数对元组序列进行分组,使用 lambda 函数来指定分组依据,最终得到按照第一个字段的值进行分组的结果。

3. 总结

groupby() 函数是非常强大的一个内建函数,可以非常方便地对相邻、相等的元素进行分组,同时也支持使用函数来指定分组的依据,还可以灵活地处理各种类型的可迭代对象,包括字符串、列表、元组等。