gpt4 book ai didi

Python,对坐标对进行操作的有效方法

转载 作者:行者123 更新时间:2023-11-28 21:59:55 29 4
gpt4 key购买 nike

我有一个包含纬度和经度信息的数据文件,我将其存储为形式为元组列表

[(lat1, lon1), (lat1, lon1), (lat2, lon2), (lat3, lon3), (lat3, lon3)  ...]

如上所示,如果数据文件中的位置未更改,则连续位置(纬度、经度)可能相同。因此,这里的顺序非常重要。我感兴趣的是一种相当有效的方法来检查坐标何时发生变化,lat1, lon1 -> lat2, lon2 等,然后获取这两个坐标之间的距离。

我已经有一个函数来获取 getDistance(lat1, lon1, lat2, lon2) 形式的距离,它返回这些位置之间的计算距离。我想将这些距离存储在一个列表中,稍后我可以从中绘制一些图。

最佳答案

您可以将过滤掉重复项的函数与迭代对的函数结合起来:

首先让我们注意消除列表中重复的后续条目。由于我们希望保持顺序,并允许彼此不相邻的重复项,因此我们不能使用简单集合。因此,如果我们使用诸如 [(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(项目): 结果 = [] 上一个 = 无 对于项目中的项目: 如果项目!=上一个: 结果.追加(项目) 上一个 = 项目 返回结果

虽然完成同样的事情,但这种方式最终会需要更多内存并且效率较低,因为它必须创建一个新列表来存储所有内容。

现在我们有办法确保每个项目都与其相邻项目不同,我们需要计算后续对之间的距离。一个简单的方法是:

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 函数。它只是跟踪它观察到的前一个项目,并且对于它处理的每个项目,它都会产生该项目和前一个项目。它使用的唯一技巧是使用 next() 函数调用将 prev 分配给列表中的第一项。

如果我们将这两个函数结合起来,我们最终会得到:

for (x1, y1), (x2, y2) in pairs(filter_duplicates(coords)):
distance = getDistance(x1, y1, x2, y2)

关于Python,对坐标对进行操作的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15805619/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com