Python实现元组点集合平均距离计算函数的问题排查
错误原因
你遇到的types.Genericaliases has no len()报错的直接原因是代码中points = list[input()]的写法错误:
list[xxx]是Python泛型类型注解的语法,不是将对象转为列表的操作,会直接返回泛型别名对象,而非列表- 额外调用
input()会读取控制台输入,直接覆盖了函数传入的点集合参数
除此之外你的代码还存在多处逻辑、语法、缩进问题:
- 缩进层级混乱,函数内部代码、循环代码的缩进完全不符合Python规范
- 遍历逻辑仅计算相邻点的距离,没有覆盖所有点对的组合,不符合“所有点之间平均距离”的需求
- 已通过
from math import sqrt导入平方根函数,后续却错误调用math.sqrt,未导入math模块会触发报错 - 求和时错误遍历单个距离变量
distance,应该遍历存储所有距离的list_dist列表 - 计算平均值使用整除
//,会丢失小数精度,应该使用普通除法/ - 没有实现点数小于2时抛出
ValueError的逻辑 - 遍历到最后一个点时调用
points[index +1]会触发索引越界错误
修正后代码
from math import sqrt from itertools import combinations def average_distance(points: set[tuple[int,int]]) -> float: # 点数校验 if len(points) < 2: raise ValueError("点集合数量不能少于2") # 生成所有不重复的两点组合 point_pairs = combinations(points, 2) total_dist = 0.0 count = 0 for (x1, y1), (x2, y2) in point_pairs: dist = sqrt((x1 - x2)**2 + (y1 - y2)**2) total_dist += dist count += 1 # 计算平均距离,保留4位小数和预期输出对齐 return round(total_dist / count, 4) # 测试用例 print(average_distance({(1,2), (3,4), (5,6)}))
运行结果
执行测试用例后输出为3.7712,和预期结果一致。
内容的提问来源于stack exchange,提问作者Agyamarky
相关产品推荐
相关产品推荐

