我有一个字典,它有一个2D列表(列表的列表)。这个二维列表包含一个粒子的x和y坐标[x,y]。每当粒子移动时,它的新坐标就会被添加到字典中的2D列表中。我想计算每个位置之间的距离,并将结果附加到另一个列表(可以只是一个没有字典的普通列表)。我想要的是如下内容:
dist1 = sqrt((x1-x0)^2 + (y1-y0)^2)
dist2 = sqrt((x2-x1)^2 + (y2-y1)^2)
.....
distN = sqrt((xN-xN-1)^2 + (yN-yN-1)^2)
但是我在访问字典中的列表元素时遇到问题。我有一个很长的2D列表,但你可以使用下面的例子给我一些建议。
c = {"coordinates":[[1,2],[3,4],[5,6],[7,8]]}
for k, dk in c.items():
for x in dk:
print(x[0], x[1])
我可以在一个循环中访问dk中的一个元素,但如何获得前一个?应该有一个很好的方法,但我只是不知道。
任何帮助都将不胜感激。
使用for循环(可能不是最有效的解决方案):
import numpy as np
c = {"coordinates":[[1,2],[3,4],[5,6],[7,8]]}
coordinates = np.array(c['coordinates'])
distances = []
for i in range(1, len(coordinates)):
distances.append(np.linalg.norm(coordinates[i-1] - coordinates[i]))
print(distances)
# [2.8284271247461903, 2.8284271247461903, 2.8284271247461903]
我也使用numpy和它的linalg.norm
函数来计算距离(如何用numpy计算欧几里得距离?),但你当然可以使用你自己的函数或计算,如果你想要的话。
我尝试了这个,它也工作:
c = {"coordinates":[[1,2],[3,4],[15,6],[7,8]]}
l1 = []
for k, dk in c.items():
for x in dk:
l1.append(x)
print(l1)
dist = [math.sqrt((p1[0]-p0[0])**2 + (p1[1]-p0[1])**2) for p1,p0 in zip(l1,l1[1:]
正如其他人在这个问题中建议的那样,获得l1
的更好方法是使用以下命令:
l1 = c["coordinates"]
dist = [math.sqrt((p1[0]-p0[0])**2 + (p1[1]-p0[1])**2) for p1,p0 in zip(l1,l1[1:]