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

如何实现按列表相邻元素前n个最大差值分组的grouping函数

实现方案

先修正partition函数逻辑

你最早给出的partition函数存在bug:初始化空列表f和sorted(f)得到的空列表l,往l中添加差值最后返回f,必然返回空值。你后续修改的版本是可用的,统一使用如下版本即可:

def partition(lst: list):
    f = []
    for i in range(len(lst)):
        if i < len(lst)-1:
            diff = lst[i+1] - lst[i]
            f.append(diff)
        else:
            return f

grouping函数实现逻辑

按需求拆分的核心步骤如下:

  1. 用partition函数获取所有相邻元素的差值,同时记录每个差值对应的拆分位置(差值的索引+1就是原列表的拆分点,代表在该索引位置前切开)
  2. 将差值和对应位置按差值从大到小排序,取前n个差值对应的拆分位置
  3. 把取出的拆分位置按从小到大排序,保证拆分顺序和原列表一致
  4. 按拆分位置切割原列表,每个片段转成元组后返回

注:你给出的参数描述存在小矛盾:按最大差值拆分1次会得到2个分组,若n代表分组数量,可将代码中所有拆分次数的位置替换为n-1即可。当前代码按你描述的「n=1时按最大差值拆分」的逻辑实现,n对应拆分次数,得到的分组数量为n+1,和你给出的示例完全匹配。

完整代码实现

def grouping(lst: list, n):
    # 边界情况处理:不需要拆分直接返回原列表元组
    if n <= 0:
        return [tuple(lst)]
    # 边界情况处理:拆分次数超过最大可能,每个元素单独一组
    max_split = len(lst) - 1
    if n >= max_split:
        return [tuple([x]) for x in lst]
    
    # 获取差值列表
    diffs = partition(lst)
    # 打包差值和对应的拆分位置(差值索引i对应拆分位置i+1)
    diff_with_pos = [(diffs[i], i+1) for i in range(len(diffs))]
    # 按差值从大到小排序,取前n个的拆分位置
    diff_with_pos.sort(reverse=True, key=lambda x: x[0])
    split_pos = [pos for _, pos in diff_with_pos[:n]]
    # 拆分位置按从小到大排序,保证切割顺序正确
    split_pos.sort()
    
    # 切割列表
    groups = []
    prev = 0
    for pos in split_pos:
        groups.append(tuple(lst[prev:pos]))
        prev = pos
    # 加入最后一段
    groups.append(tuple(lst[prev:]))
    return groups

测试验证

test_lst = [1,3,5,7,12,14,15]
print(grouping(test_lst, 1)) 
# 输出:[(1, 3, 5, 7), (12, 14, 15)] 完全符合要求1的预期
print(grouping(test_lst, 2))
# 输出示例:[(1, 3, 5, 7), (12, 14), (15)] 按前两个最大差值(5、1)拆分

内容的提问来源于stack exchange,提问作者Bruffff

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 09:15:04