如何在字典的二维粒子坐标列表中计算相邻位置的距离并访问前序元素
计算粒子相邻坐标点的距离
没问题,你已经能遍历到每个坐标点了,只差一步就能拿到前一个元素来计算距离。这里有两个简洁的实现方案,都能完美满足你的需求:
方案一:用zip配对前后坐标(最简洁直观)
Python的zip函数可以把两个可迭代对象一一配对,我们只需要把坐标列表和它的切片[1:](也就是从第二个元素开始的子列表)配对,就能同时拿到「前一个点」和「当前点」:
import math # 你的原始字典 c = {"coordinates": [[1,2],[3,4],[5,6],[7,8]]} distances = [] # 直接取出字典里的坐标列表,简化后续操作 coords = c["coordinates"] # 用zip自动配对前一个点和当前点 for prev_point, curr_point in zip(coords, coords[1:]): # 计算x、y方向的差值 dx = curr_point[0] - prev_point[0] dy = curr_point[1] - prev_point[1] # 计算欧几里得距离 distance = math.sqrt(dx**2 + dy**2) distances.append(distance) print(distances) # 输出: [2.8284271247461903, 2.8284271247461903, 2.8284271247461903]
这个方案不需要手动处理索引,代码简洁易读,是这类场景的首选写法。
方案二:用enumerate遍历索引(适合需要索引的场景)
如果你需要知道当前计算的是第几次移动的距离(比如要给距离加序号),可以用range从索引1开始遍历,通过索引差获取前一个点:
import math c = {"coordinates": [[1,2],[3,4],[5,6],[7,8]]} distances = [] coords = c["coordinates"] # 从第2个元素(索引1)开始遍历 for i in range(1, len(coords)): prev_point = coords[i-1] curr_point = coords[i] dx = curr_point[0] - prev_point[0] dy = curr_point[1] - prev_point[1] distance = math.sqrt(dx**2 + dy**2) distances.append(distance) print(distances) # 输出和上面完全一致
额外小技巧
如果追求极致简洁,还可以用列表推导式把整个计算压缩成一行:
distances = [math.sqrt((curr[0]-prev[0])**2 + (curr[1]-prev[1])**2) for prev, curr in zip(coords, coords[1:])]
而且这两个方案都很安全:如果你的坐标列表只有初始位置(长度小于2),循环会自动跳过,得到空的distances列表,不会触发报错。
内容的提问来源于stack exchange,提问作者HT121
相关产品推荐
相关产品推荐

