如何对包含近似相邻元素的列表按偏差阈值进行分组
实现方案
方法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
相关产品推荐
相关产品推荐

