我有一个字典(称为oxygen_position_dict),由以下内容组成:
{'a': (0, 0, 0), 'b': (3.3, 0, 0), 'c': (3.3, 0, 3.3), 'd': (0, 0, 3.3)}
我还有一个固定的元组,称为k_1
k_1 = (1.65, 8.25, 1.65)
并且我试图让for循环遍历字典中的值,并且仅对以下值进行距离函数计算
def distance(x1, y1, z1, x2, y2, z2):
return sqrt(((x1 - x2)**2 + (y1 - y2)**2 + (z1 - z2)**2))
以下是我的尝试:
for x in oxygen_position_dict.values():
print(distance(*(x + k_1)))
但是,输出是
8.573651497465942
8.573651497465942
8.573651497465942
8.573651497465942
仅是第一个字典值的距离计算的输出!
如何在保持k_1不变的情况下迭代整个值呢?感谢您的帮助!
答案 0 :(得分:4)
元组传递给您的函数是
(0, 0, 0, 1.65, 8.25, 1.65)
(3.3, 0, 0, 1.65, 8.25, 1.65)
(3.3, 0, 3.3, 1.65, 8.25, 1.65)
(0, 0, 3.3, 1.65, 8.25, 1.65)
给出向量的差异
(-1.65, -8.25, -1.65)
(1.65, -8.25, -1.65)
(1.65, -8.25, 1.65)
(-1.65, -8.25, 1.65)
现在加上那些平方将得到相同的结果。
使用scipy
,您将免费获得距离:
from scipy.spatial import distance
for x in oxygen_position_dict.values():
print(distance.euclidean(k_1, x))
numpy
也可以使事情变得简单:
import numpy as np
oxygen_position_dict = {'a': np.array((0, 0, 0)),
'b': np.array((3.3, 0, 0)),
'c': np.array((3.3, 0, 3.3)),
'd': np.array((0, 0, 3.3))}
k_1 = np.array((1.65, 8.25, 1.65))
for x in oxygen_position_dict.values():
print(np.linalg.norm(k_1 - x))
答案 1 :(得分:1)
显然(经过一些测试),您的代码很好!主要问题是所有值的距离都相同。我尝试手动进行计算,似乎是这样。因此,要么您真的很幸运使用这些值,要么distance()不能正常工作。
答案 2 :(得分:0)
检查以下代码:
导入数学
def distance(p0, p1):
return math.sqrt((p0[0] - p1[0])**2 + (p0[1] - p1[1])**2 + (p0[2] - p1[2])**2)
d = {'a': (0, 0, 0), 'b': (3.3, 0, 0), 'c': (3.3, 0, 3.3), 'd': (0, 0, 3.3)}
k_1 = (1.65, 8.25, 1.65)
for k,v in d.items():
print(k,'-',distance(k_1,v))
输出:
a - 8.573651497465942
b - 8.573651497465942
c - 8.573651497465942
d - 8.573651497465942
您所有的距离值都相同。