我有一个看起来像这样的csv文件(Location Name,Lat,Long):
LocA, 40, 75
LocB, 100, -80
LocC, 45, 50
LocD, 20, -30
...
我有一个硬编码的起始位置(Lat,Long):
[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文件进行排序?
答案 0 :(得分:1)
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:]))
最后一行说,“排序data
,其中每个元素d
按dist(p,d[1:])
的值排序。”这实现了您提到的关于按距离排序但保持完整数据可访问的内容。