You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按非连续数字拆分有序列表:求操作名称及现有算法

按连续整数段拆分有序序列

我有一个存在编号中断的有序实体列表:

[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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 14:41:03