【问题标题】:Find closest location from a list of locations in csv file Python从 csv 文件 Python 中的位置列表中查找最近的位置
【发布时间】:2015-04-30 21:37:59
【问题描述】:

我有一个如下所示的 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,而不是数字列表(距离)。我没有在这里进行实际计算。如果计算得当,输出可能会有所不同。我也被困在这里,因为在得到从 min 到 max 的列表后,我该如何对原始 csv 文件进行排序?

【问题讨论】:

  • 所以你的输出应该和你的输入一样?
  • 哦不,应该排序。我没有在这里进行实际计算。我只是指出输出应该有名称 + lat + long 而不是测量的距离(这是一个单一的数字)。
  • 可以将输出写入新的csv文件,而不是对原始文件进行排序。,覆盖原始文件。我现在正在添加我的代码。

标签: python sorting csv dictionary location


【解决方案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

【讨论】:

    【解决方案2】:

    这是一种方法,使用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:]))
    

    最后一行是“排序data,其中每个元素ddist(p,d[1:]) 的值排序。”这实现了您提到的按距离排序但保持完整数据可访问的内容。

    【讨论】:

    • 你知道你可以很容易地使用内置的csv.reader类:stringdata = csv.reader(open('testdata'))
    • 我不知道!也许它应该作为答案发布?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    相关资源
    最近更新 更多