修复支持两位数元素的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]
问题分析
原函数的核心问题有两个:
- 直接将子列表中元素的整数值作为桶的索引(仅0-9),当元素是多位数时(如22),会超出索引范围引发错误。
- 仅对每列元素做一次桶排序,没有处理多位数的按位排序逻辑,不符合“个位→十位”的两轮处理要求。
修改后的实现
以下代码实现了基数排序(基于桶排序),先按个位分桶排序,再按十位分桶排序,同时支持扩展到更多位数;并且可选择按字典序(从左到右列优先级)或原函数的逆字典序(从右到左列优先级)排序。
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]
代码说明
- 确定最大位数:遍历所有元素找到最大值,计算其位数,确保覆盖所有数字的每一位(如两位数则处理个位、十位两轮)。
- 列优先级控制:通过
col的循环顺序控制排序优先级,从左到右对应字典序(符合示例输出),从右到左则保持原函数的排序逻辑。 - 按位分桶:对每一列的元素,先按个位分桶收集,再按十位分桶调整,确保多位数能被正确排序,同时避免索引越界。
测试验证
- 测试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_
相关产品推荐
相关产品推荐

