按非连续数字拆分有序列表:求操作名称及现有算法
按连续整数段拆分有序序列
我有一个存在编号中断的有序实体列表:
[1, 2, 3, 6, 7, 11, 17, 18, 19]
希望在数字出现间隔的位置拆分列表,得到结果:
[[1, 2, 3], [6, 7], [11], [17, 18, 19]]
我感觉这个操作应该有特定名称,可能还有现成的库函数,但暂时想不起来,想请教下有没有现成方案避免重复造轮子?
编辑:感谢各位,但我想问的是该操作的名称及现有算法/库函数,不是实现方案——以下是我自己写的实现代码:
def group_adjoining(elements, key=lambda x: x): """Returns list of lists of contiguous elements :key: function to get key integer from list element """ if not elements: return elements result = [[elements[0]]] for a, b in zip(elements, elements[1:]): if key(a) + 1 == key(b): result[-1].append(b) else: result.append([b]) return result
操作名称与现成方案
这个操作的标准称呼是连续元素分组(英文对应 Consecutive Sequence Partitioning 或 Grouping Consecutive Elements)。
在Python中,标准库itertools里的groupby函数可以实现这个需求,核心逻辑是利用连续整数的「元素值 - 索引」为固定值的特性,中断位置该值会发生变化,以此作为分组依据:
from itertools import groupby nums = [1, 2, 3, 6, 7, 11, 17, 18, 19] result = [list(g) for _, g in groupby(nums, key=lambda x, i=iter(range(len(nums))): x - next(i))]
如果需要支持自定义key函数(和你自己实现的逻辑对齐),可以调整为:
from itertools import groupby def group_consecutive(elements, key=lambda x: x): indexed_keys = [(key(e), idx) for idx, e in enumerate(elements)] return [list(g) for _, g in groupby(elements, key=lambda e, ik=iter(indexed_keys): key(e) - next(ik)[1])]
内容的提问来源于stack exchange,提问作者Jack Deeth
相关产品推荐
相关产品推荐

