【问题标题】:Create dictionary of shortest distances grouped by their "group"?创建按“组”分组的最短距离字典?
【发布时间】:2021-10-21 14:38:57
【问题描述】:

我有一个数据文件,其中包含一堆位置坐标以及它们的“代码”名称和它们的“组”字母:

code, x,      y,    group,  n,  importance
x1, 4.5692, 2.747,    P,    1,    3
x2, 2.2551, 16.7944,  H,    2,    1
x3, 15.761, 15.1464,  R,    3,    4
x4, 15.6516, 5.1249,  C,    4,    5
x5, 6.0939, 9.8601,   S,    5,    2
...

我正在尝试编写一个函数,输出与输入位置距离最小的位置字典:

def search(inputFile,LocationCode,radius):
   from math import sin, cos, sqrt, atan2, radians
   data = dict()
   with open(inputFile) as file:        
       next(file) 
       readin = file.readlines()
       for lines in readin:
           line = lines.strip('\n')
           (code, x, y, group,n,importance) = line.split(",")
           data[code] = x,y,group,n,importance   
   float_rad = float(radius)

   to_search = []
   for i in LocationCode:
       find = data.get(i)
       to_search.append(find)

   search_x = []
   search_y = []
   for j in range(len(to_search)):
       sx = float(to_search[j][0])
       sy = float(to_search[j][1])        
       search_x.append(sx)
       search_y.append(sy)
 
   search_coord = list(zip(search_x,search_y))

   search_result = []
   distance = []

   for k in range(len(search_coord)):
       result_in_loop = []
       for i in data:
           all_x = float(data[i][0])
           all_y = float(data[i][1])
        
           if ((all_x - search_coord[k][0])**2 + (all_y - search_coord[k][1])**2) < (float_rad**2):
               result_in_loop.append(data[i])

 # Here starts to find distance & minimum...        
       distance_in_loop = []
       for o in range(len(result_in_loop)):
           dx = float(result_in_loop[o][0])
           dy = float(result_in_loop[o][1])
           if dx != search_coord[k][0] or dy != search_coord[k][1]:
               distance_in_loop.append(sqrt((dx - search_coord[k][0])**2 + (dy - search_coord[k][1])**2))       
       distance.append(distance_in_loop)

   testing = []
   for check in range(len(distance)):
       lmin = min(distance[check])
       testing.append(lmin)
            
   search_result.append(result_in_loop)    
#Test_run  
search('sample.csv',["x26", "x52"],3.5)

基本上,在函数中首先读取inputFile,并以字典的形式将其设置为“代码”作为其键。

然后使用 for 循环 dict.get() 输入 locationCode 的关联值,然后将它们附加到 to_search 列表中。

接下来从to_search 获取xy 坐标值并将它们附加到列表search_xsearch_y 然后最后将它们压缩到一个名为search_coord 的列表中(其格式类似于这个:[(4.5692,2.747),(2.2551, 16.7944)])

然后它开始搜索输入 radius 内的位置,输入 LocationCode(在 search_coord 中)的坐标为中心,首先使用 search_coord 上的 for 循环,然后使用嵌套循环在运行计算以查找半径内的位置的原始data 字典上。然后将半径内的数据位置放入result_in_loop

后来我计算了从中心输入坐标到位置的距离,附加到distance_in_loop,然后最后将值列表放在for k in range(len(search_coord)) 循环之外的distance,它确实返回了一个列表,例如[[dist_1,dist_2,dist_3...],[dist_1,dist_2,dist_3...]] .

但现在我不确定如何创建在distance 中找到最小距离的字典,然后使用数据的group 对位置值进行分组,并采用如下形式:

>>  [{'H': ('x7', 2.3034), 'R': ('x81', 0.7736), 'C': ('x99', 2.0607), 'S': ('x65', 1.556)}, {'P': ('x46', 2.4717), 'H': ('x22', 1.4374), 'R': ('x88', 2.5338), 'S': ('x30', 2.0482)}]

换句话说,试图使函数返回包含以下形式的字典的列表:

{ "group" : ("code" , the_distance) }

并且,已经尝试在distance 上使用min(),但对如何与group 建立关系感到困惑(使distance 值与原始@ 中的groupx,y 值相关987654353@字典)...

【问题讨论】:

  • 题外话:您的输入文件是 CSV 格式,因此您应该使用标准库中的 csv 模块阅读它。

标签: python python-3.x dictionary


【解决方案1】:

如果您可以将文件中的数据打包成如下结构,那么这是解决您问题的相对简单的代码:

{'group_name':('item_name',x,y)} -> 以 x,y 为坐标

那么就可以使用下面的函数了:

def find_min_distances(coordinates,data_dict):
    dx,dy=coordinates
    result={}
    for k, v in data_dict.items():
        for i in v:
            d=((i[1]-dx)**2+(i[2]-dy)**2)**0.5
            print(d,i[0],k) # just to control the result print can be removed later on!
            if k in result:
                if result[k][1]>d: # >= may make also sense depending what you want
                    result[k]=(i[0],d)
            else:
                result[k]=(i[0],d)
    return result

我测试过:

b={'H':[('x2',3.4,8.9),('x3',4.9,18.9)],'B':[('x4',1.4,1.9),('x5',14.9,8.9)],'C':[('x6',1.4,8.9),('x7',4.9,18.9)]}
print(find_min_distances((1,2),b))

交付:

{'C': ('x6', 6.911584478250989), 'B': ('x4', 0.41231056256176596), 'H': ('x2', 7.305477397131552)}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多