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

如何对包含近似相邻元素的列表按偏差阈值进行分组

实现方案

方法1:固定阈值拆分(最简单通用)

核心逻辑是预先设定相邻元素的最大允许差值,遍历列表时只要当前元素和上一个分组的末尾元素差值超过阈值,就触发拆分。

示例代码

x = [10, 11, 13, 70, 71, 73, 170, 171, 172, 174]
# 可根据业务场景调整阈值,本例中组内最大差为4,组间最小差为57,设为10即可满足需求
threshold = 10

result = [[x[0]]]
for num in x[1:]:
    if num - result[-1][-1] < threshold:
        result[-1].append(num)
    else:
        result.append([num])

print(result)
# 输出:[[10, 11, 13], [70, 71, 73], [170, 171, 172, 174]]

注意事项

  • 如果原始列表为无序列表,需要先执行x = sorted(x)排序后再拆分
  • 阈值可根据实际数据分布灵活调整,适合数据规律明确的场景

方法2:自动阈值拆分(无需手动指定参数)

如果不确定阈值,可以先计算所有相邻元素的差值,取差值序列的分位数或者突变点作为阈值,也可以使用一维聚类算法自动分组:

基于K均值聚类的实现示例

from sklearn.cluster import KMeans
import numpy as np

x = [10, 11, 13, 70, 71, 73, 170, 171, 172, 174]
# 转换为聚类需要的二维数组格式
x_arr = np.array(x).reshape(-1, 1)
# 已知要分为3组,n_clusters设为3,也可以用肘部法则自动确定分组数
kmeans = KMeans(n_clusters=3, random_state=0).fit(x_arr)
# 按聚类标签分组
groups = {}
for num, label in zip(x, kmeans.labels_):
    groups.setdefault(label, []).append(num)
# 按分组首元素排序得到最终结果
result = sorted(groups.values(), key=lambda g: g[0])

print(result)
# 输出:[[10, 11, 13], [70, 71, 73], [170, 171, 172, 174]]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 02:18:00