一日一技:使用 itertools.groupby 对已排序整数列表中的连续整数进行分组
栏目介绍
本栏目主要介绍 Python 的日常使用小技巧,希望能帮助大家利用一些碎片时间,掌握提高日常效率的方法~
使用 itertools.groupby 对已排序整数列表中的连续整数进行分组
这次我们来看一个使用 itertools.groupby 的例子。
场景:我们有一个包含已排序整数的列表,我们想要将连续的整数分组。
原始已排序整数列表:
numbers = [1, 2, 3, 6, 7, 8, 11, 12, 13, 14, 17, 18, 21, 22, 23]
不使用 itertools.groupby 的方法:
groups = []
current_group = [numbers[0]]
for i in range(1, len(numbers)):
if numbers[i] == numbers[i - 1] + 1:
current_group.append(numbers[i])
else:
groups.append(current_group)
current_group = [numbers[i]]
groups.append(current_group)
print(groups)
使用 itertools.groupby 的方法:
from itertools import groupby
groups = []
for k, g in groupby(enumerate(numbers), lambda x: x[1] - x[0]):
groups.append([item[1] for item in g])
print(groups)
在这个例子中,我们使用了 itertools.groupby 函数,它可以帮助我们轻松地根据某个条件对已排序的序列进行分组。这使得代码更加简洁。
itertools.groupby 函数接受两个参数:一个已排序的可迭代对象(如列表)和一个可选的键函数。它返回一个迭代器,该迭代器产生由键函数产生的唯一键和对应的元素组成的元组。在这个例子中,我们使用了 lambda x: x[1] - x[0] 作为键函数,将具有相同差值的连续整数分为一组。
在使用 itertools.groupby 时,需要确保代码仍具有可读性,避免在复杂情况下使用这个函数导致代码难以理解。同时,请注意,itertools.groupby 函数要求输入的可迭代对象是已排序的。
评论