如何计算列表内相邻坐标点距离?解决索引越界报错问题
问题分析与解决
你的代码出现索引越界,核心是循环逻辑完全错误,加上变量和缩进的问题,导致遍历范围超出列表长度。先拆解问题,再给修正方案:
原代码的核心问题
- 嵌套循环完全没必要:你要计算的是「相邻点」的距离,只需要遍历一次,依次取第i个和第i+1个点即可,两层循环会计算大量非相邻点,还会触发索引越界。
- 循环范围错误:外层循环
range(0, len(cords))会遍历到最后一个点,但最后一个点没有下一个点可计算;内层循环range(1, len(cords)-1)的范围逻辑混乱,当列表长度小于2时,这个范围直接无效。 - 变量与缩进问题:
dis、dista未在函数内初始化,容易受全局变量干扰;return语句缩进错误,会导致语法问题。 - 莫名引用
cm.dis:代码里突然出现cm.dis,如果不是你自定义的模块,这本身就是错误,应该直接用转换后的坐标列表。
修正后的代码
import math def find_distance(cords): # 初始化存储转换后坐标和距离的列表 converted_cords = [] distances = [] # 把所有坐标转换为浮点数(如果输入已经是浮点数,这步可以跳过) for point in cords: converted = [float(ele) for ele in point] converted_cords.append(converted) # 遍历到倒数第二个点,依次计算和下一个点的距离 for i in range(len(converted_cords) - 1): x1, y1 = converted_cords[i] x2, y2 = converted_cords[i+1] # 计算欧氏距离 dist = math.sqrt((x1 - x2)**2 + (y1 - y2)**2) distances.append(dist) return converted_cords, distances
关键说明
- 循环范围控制:
range(len(converted_cords)-1)确保只遍历到倒数第二个点,避免取i+1时超出列表索引。 - 简化逻辑:去掉不必要的嵌套循环,直接处理相邻点,既高效又不会触发索引越界。
- 变量本地化:在函数内初始化
converted_cords和distances,避免全局变量的意外影响。
内容的提问来源于stack exchange,提问作者Roadside Romeao
相关产品推荐
相关产品推荐

