我有一个数据文件,其中包含纬度和经度信息,我已将其存储为表格的元组列表
[(lat1, lon1), (lat1, lon1), (lat2, lon2), (lat3, lon3), (lat3, lon3) ...]
如上所示,如果数据文件中的位置未更改,则连续位置(lat,lon)可能相同。因此,订单在这里非常重要。我感兴趣的是一种相当有效的方法来检查坐标何时改变lat1, lon1 -> lat2, lon2
等,然后获得这两个坐标之间的距离。
我已经有了一个函数来获取格式getDistance(lat1, lon1, lat2, lon2)
的距离,它返回这些位置之间的计算距离。我希望将这些距离存储在一个列表中,稍后我可以从中创建一些图。
答案 0 :(得分:5)
你可以组合一个过滤重复的函数和一个遍历对的函数:
首先,请注意消除列表中的重复后续条目。由于我们希望保留顺序,以及允许彼此不相邻的副本,因此我们不能使用简单的集合。因此,如果我们有一个坐标列表,例如[(0, 0), (4, 4), (4, 4), (1, 1), (0, 0)]
,那么正确的输出将是[(0, 0), (4, 4), (1, 1), (0, 0)]
。完成此任务的简单功能是:
def filter_duplicates(items):
"""A generator that ignores subsequent entires that are duplicates
>>> items = [0, 1, 1, 2, 3, 3, 3, 4, 1]
>>> list(filter_duplicates(items))
[0, 1, 2, 3, 4, 1]
"""
prev = None
for item in items:
if item != prev:
yield item
prev = item
yield
语句就像return
一样,实际上并没有返回。每次调用它都会将值传递回调用函数。有关更好的解释,请参阅What does the "yield" keyword do in Python?。
这只是遍历每个项目并将其与前一项目进行比较。如果该项目不同,则将其返回给调用函数并将其存储为当前上一项。编写此函数的另一种方法是:
def filter_duplicates_2(items): result = [] prev =无 对于项目中的项目: if item!= prev: result.append(项目) prev =项目 返回结果
虽然完成了同样的事情,但这种方式最终会需要更多内存并且效率会降低,因为它必须创建一个新列表来存储所有内容。
现在我们已经有办法确保每个项目与其邻居不同,我们需要计算后续对之间的距离。一个简单的方法是:
def pairs(iterable):
"""A generate over pairs of items in iterable
>>> list(pairs([0, 8, 2, 1, 3]))
[(0, 8), (8, 2), (2, 1), (1, 3)]
"""
iterator = iter(iterable)
prev = next(iterator)
for j in iterator:
yield prev, j
prev = j
此功能类似于filter_duplicates
功能。它只是跟踪它观察到的前一个项目,并且对于它处理的每个项目,它产生该项目和前一个项目。它使用的唯一技巧是使用prev
函数调用将next()
分配给列表中的第一个项目。
如果我们将两个函数结合起来,我们最终会:
for (x1, y1), (x2, y2) in pairs(filter_duplicates(coords)):
distance = getDistance(x1, y1, x2, y2)
答案 1 :(得分:0)
以下是使用itertools
:
from itertools import *
l = [...]
ks = (k for k,g in groupby(l))
t1, t2 = tee(ks)
t2.next() # advance so we get adjacent pairs
for k1, k2 in izip(t1, t2):
# call getDistance on k1, k2
将相邻的相等元素分组,然后使用一对tee
'd迭代器从组列表中提取相邻的对。
仅使用groupby
:
l = [...]
gs = itertools.groupby(l)
last, _ = gs.next()
for k, g in gs:
# call getDistance on (last, k)
last = k