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

修复支持两位数元素的List of Lists桶排序Python函数求助

问题描述

现有一个基于桶排序的函数,用于排序元素为整数的二维列表,但仅支持元素为1位数的情况。例如输入[[1,4,2], [6,4,2], [1,4,1]]时,可得到正确输出[[1,4,1], [1,4,2], [6,4,2]];但输入包含两位数元素的数组(如[[22,11,1], [1,13,4]])时,会触发list index out of range错误。期望该数组的输出为[[1,13,4], [22,11,1]],需要修改函数分两轮处理:第一轮按个位数字将元素放入对应桶中,第二轮按十位数字调整桶的位置,最终得到正确排序结果。

原函数代码如下:

def binsort(a):
       bins = [a]

       for l in range(len(a[0])-1, -1, -1):
           binsTwo = [[] for _ in range(10)]
           for bin in bins:
               for e in bin:
                   binsTwo[e[l]].append(e)
           bins = binsTwo
    
       return [e for bin in bins for e in bin]
问题分析

原函数的核心问题有两个:

  1. 直接将子列表中元素的整数值作为桶的索引(仅0-9),当元素是多位数时(如22),会超出索引范围引发错误。
  2. 仅对每列元素做一次桶排序,没有处理多位数的按位排序逻辑,不符合“个位→十位”的两轮处理要求。
修改后的实现

以下代码实现了基数排序(基于桶排序),先按个位分桶排序,再按十位分桶排序,同时支持扩展到更多位数;并且可选择按字典序(从左到右列优先级)或原函数的逆字典序(从右到左列优先级)排序。

def radix_bucketsort(a):
    if not a:
        return []
    
    # 找到所有元素中的最大值,确定需要处理的最高位数
    max_num = max(num for sublist in a for num in sublist)
    max_digits = len(str(max_num))
    
    bins = [a]
    # 按列从左到右处理(实现字典序排序,符合示例期望)
    # 若要保持原函数从右到左的优先级,改为:range(len(a[0])-1, -1, -1)
    for col in range(len(a[0])):
        # 对当前列的每一位从个位到最高位依次处理
        for digit_pos in range(max_digits):
            bins_two = [[] for _ in range(10)]
            for bin in bins:
                for sublist in bin:
                    # 提取当前列元素的指定位数字(个位:digit_pos=0,十位:digit_pos=1)
                    num = sublist[col]
                    current_digit = (num // (10 ** digit_pos)) % 10
                    bins_two[current_digit].append(sublist)
            bins = bins_two
    
    # 合并所有桶的结果
    return [sublist for bin in bins for sublist in bin]
代码说明
  1. 确定最大位数:遍历所有元素找到最大值,计算其位数,确保覆盖所有数字的每一位(如两位数则处理个位、十位两轮)。
  2. 列优先级控制:通过col的循环顺序控制排序优先级,从左到右对应字典序(符合示例输出),从右到左则保持原函数的排序逻辑。
  3. 按位分桶:对每一列的元素,先按个位分桶收集,再按十位分桶调整,确保多位数能被正确排序,同时避免索引越界。
测试验证
  • 测试1位数输入:
    print(radix_bucketsort([[1,4,2], [6,4,2], [1,4,1]]))
    # 输出:[[1,4,1], [1,4,2], [6,4,2]](与原函数结果一致)
    
  • 测试多位数输入:
    print(radix_bucketsort([[22,11,1], [1,13,4]]))
    # 输出:[[1,13,4], [22,11,1]](符合期望)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 05:25:37