我有包含点名称和坐标的字典:
{
'A':{
'latitude':'50.46681789',
'longitude':'30.6370689'
},
'B':{
'latitude':'50.45898787',
'longitude':'30.63235446'
},
'C':{
'latitude':'50.45699448',
'longitude':'30.62394564'
}
我需要找到字典各点之间的距离。我已经具有处理距离的功能,但是我需要按格式迭代dict:
[
{
'name': 'AB',
'distance': <distance_between_A_B>,
},
{
'name': 'BC',
'distance': <distance_between_B_C>,
},
{
'name': 'AC',
'distance': <distance_between_A_C>,
}
]
我的问题是我无法在没有重复的情况下通过源字典来纠正迭代。
答案 0 :(得分:1)
itertools.combinations
方法听起来像您所需要的。给定对某些元素(例如字典的键)可迭代的输入,它将对那些元素的所有可能的元组进行迭代,而无需重复任何操作。
for (key1, key2) in itertools.combinations(your_dict.keys(), 2):
# find distance between key1 and key2
result_dict = {'name': key1 + key2, 'distance': found_distance}
# do something with result_dict
答案 1 :(得分:0)
正如@David所说,您可以像这样创建字典,所以我只介绍计算距离部分。
import itertools
from math import sin, cos, sqrt, atan2, radians
r = 6373.0 # Erath radius in 'KM'
for (key1, key2) in itertools.combinations(your_dict.keys(), 2):
# find distance between key1 and key2
first_lat = radians(float(your_dict[key1]['latitude']))
first_long = radians(float(your_dict[key1]['longitude']))
second_lat = radians(float(your_dict[key2]['latitude']))
second_long = radians(float(your_dict[key2]['longitude']))
delta_lat = second_lat - first_lat
delta_long = second_long - first_lat
t = sin(delta_lat / 2)**2 + cos(first_lat) * cos(second_lat) * sin(delta_long / 2)**2
distance = r * (2 * atan2(sqrt(t), sqrt(1 - t)))
result_dict = {'name': key1 + key2, 'distance': distance}
result_dict
将是您想要的输出。