在我的函数中循环浏览字典值

时间:2019-02-27 06:04:49

标签: python dictionary

我有一个字典(称为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不变的情况下迭代整个值呢?感谢您的帮助!

3 个答案:

答案 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

您所有的距离值都相同。