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

如何实现按最大间隙拆分Python列表k次的函数?

问题描述

给定列表:

data = [71.4, 72.73, 74.36, 75.38, 76.15, 76.96, 79.51, 86.82, 87.81, 87.87, 146.38, 150.89, 151.16, 152.18, 152.36, 153.27, 155.7, 160.99, 161.36, 164.55]

请编写一个包含data和k两个参数的函数:

  • data:传入上述列表
  • k:需要返回的子列表数量

示例调用效果:

  1. 调用separate(data, 2)应返回:
[[71.4, 72.73, 74.36, 75.38, 76.15, 76.96, 79.51, 86.82, 87.81, 87.87], [146.38, 150.89, 151.16, 152.18, 152.36, 153.27, 155.7, 160.99, 161.36, 164.55]]
  1. 调用separate(data, 1)应返回:
[[71.4, 72.73, 74.36, 75.38, 76.15, 76.96, 79.51, 86.82, 87.81, 87.87, 146.38, 150.89, 151.16, 152.18, 152.36, 153.27, 155.7, 160.99, 161.36, 164.55]]
  1. 调用separate(data, 3)应返回:
[[71.4, 72.73, 74.36, 75.38, 76.15, 76.96, 79.51], [86.82, 87.81, 87.87], [146.38, 150.89, 151.16, 152.18, 152.36, 153.27, 155.7, 160.99, 161.36, 164.55]]
解决方案

观察示例可知,函数核心是基于数据中的数值间隙分割列表——原数据存在两处明显的数值断层(79.51到86.82、87.87到146.38),分割时优先在这些间隙处拆分,以满足子列表数量k的要求。

以下是实现代码:

def separate(data, k):
    # 计算相邻元素差值,记录间隙位置
    gaps = []
    for i in range(1, len(data)):
        diff = data[i] - data[i-1]
        # 以差值大于10为阈值判定有效间隙(适配原数据的断层特征)
        if diff > 10:
            gaps.append(i)
    
    # k=1时直接返回原列表的嵌套形式
    if k == 1:
        return [data.copy()]
    
    # 确保k不超过最大可分割数(间隙数+1)
    k = min(k, len(gaps) + 1)
    
    # 取前k-1个间隙作为分割点
    split_points = gaps[:k-1]
    split_points.sort()
    
    # 执行列表分割
    result = []
    start = 0
    for point in split_points:
        result.append(data[start:point])
        start = point
    result.append(data[start:])
    
    return result

代码说明

  1. 间隙检测:遍历列表计算相邻元素差值,将差值超过阈值的位置标记为间隙;
  2. 边界处理:当k=1时直接返回原列表;若k大于最大可分割数,自动取最大可分割数;
  3. 分割逻辑:根据前k-1个间隙位置,将原列表拆分为k个子列表。

测试验证

代入示例数据测试:

data = [71.4, 72.73, 74.36, 75.38, 76.15, 76.96, 79.51, 86.82, 87.81, 87.87, 146.38, 150.89, 151.16, 152.18, 152.36, 153.27, 155.7, 160.99, 161.36, 164.55]

print(separate(data, 2))
# 输出:[[71.4, 72.73, 74.36, 75.38, 76.15, 76.96, 79.51, 86.82, 87.81, 87.87], [146.38, 150.89, 151.16, 152.18, 152.36, 153.27, 155.7, 160.99, 161.36, 164.55]]

print(separate(data, 1))
# 输出:[[71.4, 72.73, 74.36, 75.38, 76.15, 76.96, 79.51, 86.82, 87.81, 87.87, 146.38, 150.89, 151.16, 152.18, 152.36, 153.27, 155.7, 160.99, 161.36, 164.55]]

print(separate(data, 3))
# 输出:[[71.4, 72.73, 74.36, 75.38, 76.15, 76.96, 79.51], [86.82, 87.81, 87.87], [146.38, 150.89, 151.16, 152.18, 152.36, 153.27, 155.7, 160.99, 161.36, 164.55]]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 09:57:37