如何实现按列表相邻元素前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函数实现逻辑
按需求拆分的核心步骤如下:
- 用partition函数获取所有相邻元素的差值,同时记录每个差值对应的拆分位置(差值的索引+1就是原列表的拆分点,代表在该索引位置前切开)
- 将差值和对应位置按差值从大到小排序,取前
n个差值对应的拆分位置 - 把取出的拆分位置按从小到大排序,保证拆分顺序和原列表一致
- 按拆分位置切割原列表,每个片段转成元组后返回
注:你给出的参数描述存在小矛盾:按最大差值拆分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
相关产品推荐
相关产品推荐

