Python构建KD树报TypeError列表索引不能为浮点数错误求助
KD树构建时浮点数索引报错排查
报错基础信息
- 触发位置:
Scripts\gw_kd_tree.py文件第89行build_kdtree函数内 - 抛出错误:
TypeError: list indices must be integers or slices, not float - 对应出错代码:
node = KDTreeNode [(point=point_list[median], left=build_kdtree(point_list[0:median], depth+1), right=build_kdtree(point_list[median+1:], depth+1))]
错误原因
核心触发逻辑是作为列表索引、切片边界的median变量为浮点数类型,Python原生列表不支持浮点数作为索引或切片参数。
常规KD树实现中median是用来取当前维度分割点的中位数索引,绝大多数场景下这个值是浮点数的原因是:计算中位数索引时使用了普通除法/,Python3中/运算符无论是否能整除,返回结果都是float类型(比如长度为3的列表,3/2得到的是1.0而非整数1),用这个值去取列表元素、做切片就会触发类型错误。
另外贴出的代码还存在一处语法问题:实例化KDTreeNode类时错误使用了列表定义的方括号[],应该用传参的圆括号(),这个问题在索引错误修复后也会触发语法报错,需要一并修正。
修复方案
- 把
median的计算逻辑从普通除法改为整数除法,使用//运算符,确保返回值为整数类型:
如果# 原错误写法参考:median = len(point_list) / 2 median = len(point_list) // 2median是其他自定义逻辑计算得到的,在作为索引用之前用int(median)做强制类型转换即可。 - 修正类实例化的语法错误,把
KDTreeNode后面的方括号改成圆括号。
修复后的完整代码段参考:
median = len(point_list) // 2 node = KDTreeNode( point=point_list[median], left=build_kdtree(point_list[:median], depth + 1), right=build_kdtree(point_list[median+1:], depth + 1) )
内容的提问来源于stack exchange,提问作者Rebecca Quinn
相关产品推荐
相关产品推荐

