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

无需使用内置函数 如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 08:54:01