【发布时间】: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 获取x 和y 坐标值并将它们附加到列表search_x 和search_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 值与原始@ 中的group 和x,y 值相关987654353@字典)...
【问题讨论】:
-
题外话:您的输入文件是 CSV 格式,因此您应该使用标准库中的
csv模块阅读它。
标签: python python-3.x dictionary