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

如何高效分组首元素连续且次元素相同的二元组?

优化连续键值对分组的实现

需求概述

我有一个二元组列表,每个二元组的首元素是整数,等价于键值对(由list(d.items())生成)。键保证唯一,存在大量值相同且键为连续整数的键值对(后一个键等于前一个键加1)。需要将这些键值对分组为三元组:(起始键, 结束键, 对应值)。

逻辑示例

  • 输入:[(0, 0), (1, 0), (2, 0)],输出:[(0, 2, 0)]
  • 输入:[(0, 0), (1, 0), (2, 0), (3, 1), (4, 1)],输出:[(0, 2, 0), (3, 4, 1)]
  • 输入:[(0, 0), (1, 0), (2, 0), (3, 1), (4, 1), (5, 2), (7, 2), (9, 2)],输出:[(0, 2, 0), (3, 4, 1), (5, 5, 2), (7, 7, 2), (9, 9, 2)](5、7、9非连续,故单独分组)

测试用例

输入

[(3, 0),
 (4, 0),
 (5, 0),
 (6, 2),
 (7, 2),
 (8, 2),
 (9, 2),
 (10, 2),
 (11, 2),
 (12, 2),
 (13, 1),
 (14, 1),
 (15, 3),
 (16, 3),
 (17, 3),
 (18, 3),
 (19, 3),
 (20, 3),
 (21, 3),
 (22, 3),
 (23, 3),
 (24, 3),
 (25, 3),
 (26, 3),
 (27, 1),
 (28, 1)]

预期输出

[(3, 5, 0), (6, 12, 2), (13, 14, 1), (15, 26, 3), (27, 28, 1)]

现有实现及问题

现有代码能得到正确输出,但效率不足:

def group_numbers(numbers):
    l = len(numbers)
    i = 0
    output = []
    while i < l:
        di = 0
        curn, curv = numbers[i]
        while i != l and curn + di == numbers[i][0] and curv == numbers[i][1]:
            i += 1
            di += 1
        output.append((curn, numbers[i - 1][0], curv))
    return output

测试用例生成代码:

import random

def make_test_case(num, lim, dat):
    numbers = {}

    for _ in range(num):
        start = random.randrange(lim)
        end = random.randrange(lim)
        if start > end:
            start, end = end, start
        x = random.randrange(dat)
        numbers |= {n: x for n in range(start, end + 1)}

    return sorted(numbers.items())

优化需求

如何更高效实现该功能?比如使用itertools.groupby?要求输出与现有正确方法完全一致。

补充说明

  • 输入中可能存在无值的间隙,此类间隙不应被填充
  • 输入不会出现重复键,若遇到需抛出异常

内容的提问来源于stack exchange,提问作者Ξένη Γήινος

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 02:32:26