You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python实现Radix Sort算法处理含Float类型元素的列表时出现索引错误,请求解决方案

解决基数排序处理浮点数时的索引错误问题

嗨,我看到你在使用基数排序处理包含浮点数的数组时遇到了list indices must be integers or slices, not float的错误,这是因为基数排序的核心逻辑是基于整数的数位来排序的,直接处理浮点数会导致计算出的数位索引变成浮点数,从而触发数组索引的类型错误。

错误原因分析

在你的countingSortForRadix函数中,这一行代码是问题的根源:

placeElement = (inputArray[i] // placeValue) % 10

inputArray[i]是浮点数(比如67.5)时,67.5 // 1的结果是67.5,再对10取余得到7.5——这个浮点数无法作为数组countArray的索引,所以抛出了错误。

另外,你计算最大位数D的逻辑对浮点数也不适用,因为浮点数的除法会一直得到小数,导致循环次数远超实际需要的整数位数。

解决方案:将浮点数转换为整数处理

基数排序天生适合处理整数,我们可以通过以下步骤适配浮点数:

  1. 找出数组中所有数的最大小数位数,计算一个放大倍数(比如最大小数位是1,就乘以10)。
  2. 将所有浮点数放大为整数,这样就能用原本的基数排序逻辑处理。
  3. 排序完成后,再将结果缩小回原来的浮点数形式。

修改后的完整代码

def get_decimal_places(num):
    """辅助函数:计算一个数的有效小数位数"""
    if isinstance(num, float):
        num_str = str(num)
        if '.' in num_str:
            # 处理类似2.0这样的浮点数,其小数部分全为0的情况
            decimal_part = num_str.split('.')[1].rstrip('0')
            return len(decimal_part) if decimal_part else 0
        else:
            return 0
    else:
        # 整数的小数位数为0
        return 0

def countingSortForRadix(inputArray, placeValue):
    countArray = [0] * 10
    inputSize = len(inputArray)
    for i in range(inputSize):
        placeElement = (inputArray[i] // placeValue) % 10
        countArray[placeElement] += 1
    for i in range(1, 10):
        countArray[i] += countArray[i - 1]
    outputArray = [0] * inputSize
    i = inputSize - 1
    while i >= 0:
        currentEl = inputArray[i]
        placeElement = (inputArray[i] // placeValue) % 10
        countArray[placeElement] -= 1
        newPosition = countArray[placeElement]
        outputArray[newPosition] = currentEl
        i -= 1
    return outputArray

def radixSort(inputArray):
    # 1. 计算所有数的最大小数位数
    max_decimal = max(get_decimal_places(num) for num in inputArray)
    multiplier = 10 ** max_decimal
    
    # 2. 将浮点数转换为整数(用round避免浮点数精度问题)
    int_array = [int(round(num * multiplier)) for num in inputArray]
    
    # 3. 计算整数数组中最大数的位数
    maxEl = max(int_array)
    digits = 0
    if maxEl == 0:
        digits = 1
    else:
        temp = maxEl
        while temp > 0:
            temp = temp // 10
            digits += 1
    
    # 4. 对整数数组执行基数排序
    placeVal = 1
    outputArray = int_array
    for _ in range(digits):
        outputArray = countingSortForRadix(outputArray, placeVal)
        placeVal *= 10
    
    # 5. 将排序后的整数转换回浮点数
    result = [num / multiplier for num in outputArray]
    return result

# 测试代码
data = (2.0, 67.5, 34, 12.4, 54)
print("原始数据:", data)
print("排序后数据:", radixSort(data))

关键修改点说明

  1. 新增get_decimal_places函数:准确计算每个数的有效小数位数(比如2.0的小数位数视为0)。
  2. 浮点数转整数:通过放大倍数将所有数转换为整数,确保基数排序的数位计算都是整数操作,用round避免浮点数精度问题。
  3. 修正位数计算逻辑:对转换后的整数计算位数,使用整数除法//避免浮点数循环的无限迭代问题。
  4. 结果还原:排序完成后将整数缩小回原来的浮点数格式。

运行结果

原始数据: (2.0, 67.5, 34, 12.4, 54)
排序后数据: [2.0, 12.4, 34.0, 54.0, 67.5]

这样就能正确处理包含浮点数的数组排序啦!

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

火山引擎 最新活动