无需使用内置函数 如何用Python将数值按相似性划分为指定数量组
数值聚类分组实现方案
你当前的代码功能是生成指定长度的元素组合,和按数值相似度分组的需求逻辑完全不符,可按以下思路重新实现,全程无需依赖itertools或其他第三方库:
- 先对输入列表做升序排序,排序后数值接近的元素会自然相邻
- 计算所有相邻元素的差值,同时记录每个差值对应的切分位置
- 选出差值最大的前
n-1个位置作为切分点,这些位置就是两组数值差异最大的分界处 - 按照选好的切分点对排序后的列表做拆分,即可得到
n个数值相似的分组
实现代码
def cluster_numbers(lst, n): # 边界处理:分组数大于等于列表长度时每个元素单独一组 if n >= len(lst): return [[num] for num in sorted(lst)] # 第一步:排序输入列表 sorted_lst = sorted(lst) # 第二步:计算相邻差值与对应位置 diffs = [] for i in range(len(sorted_lst) - 1): diff = sorted_lst[i+1] - sorted_lst[i] diffs.append((-diff, i)) # 存储负差值方便直接升序排序得到差值从大到小的顺序 # 第三步:提取前n-1个最大差值对应的切分点,排序切分点保证切分顺序正确 split_pos = sorted([i for (neg_diff, i) in sorted(diffs)[:n-1]]) # 第四步:按切分点拆分列表得到分组 groups = [] prev = 0 for pos in split_pos: groups.append(sorted_lst[prev:pos+1]) prev = pos + 1 groups.append(sorted_lst[prev:]) return groups
测试效果
# 测试示例输入 test_lst = [10,12,45,47,91,98,99] print(cluster_numbers(test_lst, 2)) # 输出:[[10, 12, 45, 47], [91, 98, 99]] print(cluster_numbers(test_lst, 3)) # 输出:[[10, 12], [45, 47], [91, 98, 99]] # 测试你提供的输入列表 your_lst = [1,1,76,45,45,4,5,99,105] print(cluster_numbers(your_lst, 3)) # 输出:[[1, 1, 4, 5], [45, 45, 76], [99, 105]]
内容的提问来源于stack exchange,提问作者Bruffff
相关产品推荐
相关产品推荐

