如何实现按最大间隙拆分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:需要返回的子列表数量
示例调用效果:
- 调用
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]]
- 调用
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]]
- 调用
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
代码说明
- 间隙检测:遍历列表计算相邻元素差值,将差值超过阈值的位置标记为间隙;
- 边界处理:当
k=1时直接返回原列表;若k大于最大可分割数,自动取最大可分割数; - 分割逻辑:根据前
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
相关产品推荐
相关产品推荐

