从上一个设置新的键值字典

2022-07-06 12:38:33 发布

您现在位置:Python中文网/ 问答频道 /正文

抱歉,代码转储太多了。我的问题是我的最后一个for循环。我正在尝试建立一个新的字典“候选者”,它包含一个站点和另一个站点的所有可能的组合,映射到它们之间的距离。例如,假设站点1的ID为1234,站点2的ID为1235,站点3的ID为1236。我希望候选字典最终是{1234\u 1235':距离,'1234\u 1236':距离},即从一个站点到其他站点的所有可能的组合。这些组合已经包含在dictkey中;我只需要重新组织它们。这是为了我可以弹出最短的距离,并最终得到一个名单的“最近的邻居”到每个网站。你知道吗

for i in np.arange(num_sites):
    lat1 = lat[i]
    lon1 = lon[i]
    site1=site[i]
    rat1 = lat1*np.pi/180.0
    ron1 = lon1*np.pi/180.0
    for j in np.arange(i+1,num_sites):
        lat2 = lat[j]
        lon2 = lon[j]
        site2= site[j]
        rat2 = lat2*np.pi/180.0
        ron2 = lon2*np.pi/180.0

使用哈弗森公式计算距离

        d = 2.0*np.arcsin(np.sqrt((np.sin((rat1-rat2)/2))**2 +
            np.cos(rat1)*np.cos(rat2)*(np.sin((ron1-ron2)/2))**2))

        # dist_arr[i,j] = 6371.0 * d

        dictkey[site1+"_"+site2] = 6371.0*d

temporary = set()
for key in dictkey: 
    parts = key.split("_")
    site_one = parts[0]
    site_two = parts[1]
    temporary.add(site_one)
for temps in temporary:
    candidates = dict()
    for key in dictkey:
        parts = key.split("_")
        site_one = parts[0]
        site_two = parts[1]
        if site_one == temps:
            candidates[site_one] = dictkey[key]

Tags: keyinid距离for站点nppisiteonepartstemporarydictkeyrat1rat2
1条回答
网友
1楼 ·

最简单的方法是在计算距离的过程中准备候选人。只需准备候选人的口述,而不是口述:

candidates = {}
for i in np.arange(num_sites):
lat1 = lat[i]
lon1 = lon[i]
site1=site[i]
rat1 = lat1*np.pi/180.0
ron1 = lon1*np.pi/180.0
for j in np.arange(i+1,num_sites):
    lat2 = lat[j]
    lon2 = lon[j]
    site2= site[j]
    rat2 = lat2*np.pi/180.0
    ron2 = lon2*np.pi/180.0

    d = 2.0*np.arcsin(np.sqrt((np.sin((rat1-rat2)/2))**2 +
        np.cos(rat1)*np.cos(rat2)*(np.sin((ron1-ron2)/2))**2))


    distance = 6371.0*d
    if site1 in candidates:
        candidates[site1][site2] = distance
    else:
        candidates[site1] = {site2: distance}

    if site2 in candidates:
        candidates[site2][site1] = distance
    else:
        candidates[site2] = {site1: distance}

上面的解决方案将为您提供字典候选人与字典的距离,以所有其他网站。当然,它的大小是原来的两倍—它存储1234->;4567和4567->;1234的相同数据。你知道吗

candidates.get('1234', {}).get('4567') == candidates.get('4567', {}).get('1234')
>>True

但正如您所见,它提供了获取价值的简单方法。 例如,如果您需要到达距离1234最远的地点:

import operator
closest_site = sorted(candidates.get('1234', {}).items(), key=operator.itemgetter(1))

摘自答案1

最近的站点将是元组:(<ID of closest site>, <distance>)

如果您需要更节省内存的解决方案,请写信。这不是最佳的,因为它会生成两倍大小的数据。你知道吗

更新

如果您需要获取原始站点的ID以及最短距离站点:

closest_site = (candidates.get('1234'),) + sorted(candidates.get('1234', {}).items(), key=operator.itemgetter(1))

最近的地点:(<ID of original site>, <ID of closest site>, <distance>)