从 csv 文件中的位置列表中查找最近的位置 Python
Find closest location from a list of locations in csv file Python
我有一个如下所示的 csv 文件(位置名称、纬度、经度):
LocA, 40, 75
LocB, 100, -80
LocC, 45, 50
LocD, 20, -30
...
我有一个硬编码的起始位置(纬度、经度):
[20, -30]
使用欧几里德:
d = sqrt((x2 - x1)^2 + (y2 - y1)^2)
我需要一个距离我的起点最近的位置的列表(或数组)。我坚持循环浏览 csv 文件并从那里获取所有纬度和经度。我不知道是应该在循环内进行计算,还是在将所有内容保存在集合中后再进行计算。我在想用字典,把所有的东西都放在里面,循环之后,做计算。
# parse csv file using csv library
myCSV = csv.reader(open("temp.csv"))
dict = {}
# extract lats and longs in the csv file
for line in myCSV:
另一件事是预期的输出应该是这样的:
LocC, 45, 50
LocD, 20, -30
LocA, 40, 75
LocB, 100, -80
...
不是从最小到最大排序的数字列表。上面的例子只是为了指出输出应该是 name + lat + long,而不是数字(距离)列表。我没有在这里进行实际计算。如果正确计算,输出可能会有所不同。我也被困在这里,因为从最小到最大的列表后,我该如何对原始 csv 文件进行排序?
这是一种方法,使用 regular expression:
import math, re
def dist(a,b):
return math.sqrt((a[0] - b[0])**2 + (a[1] - b[1])**2)
p = [20,-30]
stringdata = re.findall('(.*), (.*), (.*)',open('testdata').read())
data = [(l,int(x),int(y)) for l,x,y in stringdata]
sorteddata = sorted(data, key=lambda d: dist(p,d[1:]))
最后一行说,"sort data
, where each element d
is sorted by the value of dist(p,d[1:])
."这实现了您提到的按距离排序但保持完整数据可访问的内容。
1) 向字典中添加值
>>> import csv
>>> mycsv = csv.reader(open("ex4.csv"))
>>> dct = {}
>>> for lines in mycsv:
... dct[lines[0]] = lines[1:]
>>> dct
{'LocB': [' 100', ' -80'], 'LocC': [' 45', ' 50'], 'LocD': [' 20', ' -30']}
2) 定义欧几里得函数和偏欧几里得函数(我刚刚意识到不需要部分欧几里得函数。我应该用默认 x1=20, y1=30
个参数定义欧几里得函数)
>>> import math
>>> from functools import partial
>>> def euclidean(x1, y1, x2, y2):
... return math.sqrt((x1-x2)**2 + (y1-y2)**2)
>>> euc = partial(euclidean, 20, 30) #beginning coordinates
3) 计算距离
>>> for k in dct.keys():
... d = euc(int(dct[k][0]), int(dct[k][0]))
... dis.append((k, d))
...
>>> dis = sorted(dis, key=lambda x: x[1])
>>> dis
[('LocD', 10.0), ('LocC', 29.154759474226502), ('LocB', 106.30145812734649)]
4) 排序。我刚刚打印了结果。也许您想打开一个新文件并将排序结果写入文件。
>>> for x, y in dis:
... for k in dct.keys():
... if x == k:
... print x, " ".join(dct[k])
...
LocD 20 -30
LocC 45 50
LocB 100 -80
我有一个如下所示的 csv 文件(位置名称、纬度、经度):
LocA, 40, 75
LocB, 100, -80
LocC, 45, 50
LocD, 20, -30
...
我有一个硬编码的起始位置(纬度、经度):
[20, -30]
使用欧几里德:
d = sqrt((x2 - x1)^2 + (y2 - y1)^2)
我需要一个距离我的起点最近的位置的列表(或数组)。我坚持循环浏览 csv 文件并从那里获取所有纬度和经度。我不知道是应该在循环内进行计算,还是在将所有内容保存在集合中后再进行计算。我在想用字典,把所有的东西都放在里面,循环之后,做计算。
# parse csv file using csv library
myCSV = csv.reader(open("temp.csv"))
dict = {}
# extract lats and longs in the csv file
for line in myCSV:
另一件事是预期的输出应该是这样的:
LocC, 45, 50
LocD, 20, -30
LocA, 40, 75
LocB, 100, -80
...
不是从最小到最大排序的数字列表。上面的例子只是为了指出输出应该是 name + lat + long,而不是数字(距离)列表。我没有在这里进行实际计算。如果正确计算,输出可能会有所不同。我也被困在这里,因为从最小到最大的列表后,我该如何对原始 csv 文件进行排序?
这是一种方法,使用 regular expression:
import math, re
def dist(a,b):
return math.sqrt((a[0] - b[0])**2 + (a[1] - b[1])**2)
p = [20,-30]
stringdata = re.findall('(.*), (.*), (.*)',open('testdata').read())
data = [(l,int(x),int(y)) for l,x,y in stringdata]
sorteddata = sorted(data, key=lambda d: dist(p,d[1:]))
最后一行说,"sort data
, where each element d
is sorted by the value of dist(p,d[1:])
."这实现了您提到的按距离排序但保持完整数据可访问的内容。
1) 向字典中添加值
>>> import csv
>>> mycsv = csv.reader(open("ex4.csv"))
>>> dct = {}
>>> for lines in mycsv:
... dct[lines[0]] = lines[1:]
>>> dct
{'LocB': [' 100', ' -80'], 'LocC': [' 45', ' 50'], 'LocD': [' 20', ' -30']}
2) 定义欧几里得函数和偏欧几里得函数(我刚刚意识到不需要部分欧几里得函数。我应该用默认 x1=20, y1=30
个参数定义欧几里得函数)
>>> import math
>>> from functools import partial
>>> def euclidean(x1, y1, x2, y2):
... return math.sqrt((x1-x2)**2 + (y1-y2)**2)
>>> euc = partial(euclidean, 20, 30) #beginning coordinates
3) 计算距离
>>> for k in dct.keys():
... d = euc(int(dct[k][0]), int(dct[k][0]))
... dis.append((k, d))
...
>>> dis = sorted(dis, key=lambda x: x[1])
>>> dis
[('LocD', 10.0), ('LocC', 29.154759474226502), ('LocB', 106.30145812734649)]
4) 排序。我刚刚打印了结果。也许您想打开一个新文件并将排序结果写入文件。
>>> for x, y in dis:
... for k in dct.keys():
... if x == k:
... print x, " ".join(dct[k])
...
LocD 20 -30
LocC 45 50
LocB 100 -80