Python 给定元组坐标列表,查找与指定坐标最近的坐标

Python 给定元组坐标列表,查找与指定坐标最近的坐标,python,Python,最有效的方法是什么?我当前的实现非常混乱: def distanceTo(self, start, end): """Distance from cell A to cell B.""" startx, starty = start endx, endy = end return math.sqrt(math.pow(math.fabs(endx - startx), 2) + math.pow(math.fabs(en

最有效的方法是什么?我当前的实现非常混乱:

def distanceTo(self, start, end):
    """Distance from cell A to cell B."""
    startx, starty = start
    endx, endy =  end
    return math.sqrt(math.pow(math.fabs(endx - startx), 2)
                     + math.pow(math.fabs(endy - starty), 2))


def findNearestBuildings(self, myCoords, buildingGroup):
    """Returns a list of buildings specified, in ascending order of distance"""
    if len(buildingGroup.sprites()) == 0:
        return None
    buildings = []
    distances = []
    for building in buildingGroup.sprites():
        distance = self.distanceTo(myCoords, building.coords)
        for i in range(len(buildings)):
            if distances[i] < distance:
                if i == len(buildings):
                    buildings.append(building)
                    distances.append(distance)
            elif distances[i] >= distance:
                buildings.insert(i, building)
                distances.insert(i, distance)
        if len(buildings) == 0:
            buildings.append(building)
            distances.append(distance)
    return buildings
def距离到(自身、开始、结束):
“从单元A到单元B的距离”
startx,starty=开始
endx,endy=结束
返回math.sqrt(math.pow(math.fabs(endx-startx),2)
+math.pow(math.fabs(endy-starty),2))
def findNearestBuildings(自我、MyWord、buildingGroup):
“”“返回按距离升序排列的指定建筑物列表”“”
如果len(buildingGroup.sprites())==0:
一无所获
建筑物=[]
距离=[]
对于buildingGroup.sprites()中的建筑:
距离=self.distanceTo(myCoords、building.coords)
对于范围内的i(len(建筑物)):
如果距离[i]<距离:
如果i==len(建筑物):
建筑物。附加(建筑物)
距离。追加(距离)
elif距离[i]>=距离:
建筑物.插入(i,建筑物)
距离。插入(i,距离)
如果len(建筑物)==0:
建筑物。附加(建筑物)
距离。追加(距离)
归还建筑物

哪种方法更有效?我正在使用PyGame,但这应该是一个相当普遍适用的问题。所有坐标都是整数值。

查找到所有建筑物的距离(N)。 排序距离(Nln(N))


这是最快的方法。

查找到所有建筑物的距离(N)。 排序距离(Nln(N))


这是最快的方法。

您可以应用以下几个常见技巧:

  • 如果列表进展缓慢,则可以缓存
    距离
    功能(例如,使用装饰器或使用dict手动),请参阅

  • 使用另一个范数(
    max.fabs(x-x0)、math.fabs(y-y0))
    ,您的
    距离函数可能会快得多:这将防止缓慢的sqrt

  • 您的平方值,无需在其上使用
    fabs

  • 可以使用排序原语使函数易于阅读(除非我误解了它的作用)

例如:

def findNearestBuildings(self, myCoords, buildingGroup):
      return sorted(buildingGroup.sprites(),key= lambda x:self.distance(x,myCoords))

您可以应用以下几个常见技巧:

  • 如果列表进展缓慢,则可以缓存
    距离
    功能(例如,使用装饰器或使用dict手动),请参阅

  • 使用另一个范数(
    max.fabs(x-x0)、math.fabs(y-y0))
    ,您的
    距离函数可能会快得多:这将防止缓慢的sqrt

  • 您的平方值,无需在其上使用
    fabs

  • 可以使用排序原语使函数易于阅读(除非我误解了它的作用)

例如:

def findNearestBuildings(self, myCoords, buildingGroup):
      return sorted(buildingGroup.sprites(),key= lambda x:self.distance(x,myCoords))

不用费心求平方根了!在计算机上是slo-o-o-o-w。如果一座建筑物比另一座建筑物更近,它们之间距离的平方也将小于与其他建筑物之间距离的平方

我的意思是,如果最近的建筑距离我们10米,而接下来的两个最近的建筑距离我们11米和12米,你可以很容易地比较100(10^2),并说它小于121(11^2)和144(12^2)-这将永远是正确的,因为

if a < b then a^2 < b^2  (for all positive a and b)

不用费心求平方根了!在计算机上是slo-o-o-o-w。如果一座建筑物比另一座建筑物更近,它们之间距离的平方也将小于与其他建筑物之间距离的平方

我的意思是,如果最近的建筑距离我们10米,而接下来的两个最近的建筑距离我们11米和12米,你可以很容易地比较100(10^2),并说它小于121(11^2)和144(12^2)-这将永远是正确的,因为

if a < b then a^2 < b^2  (for all positive a and b)

我想这是回答你问题的好地方。而且我猜可能在同一距离有两个coords,对吧?对不起@Michal,我不知道。我想这是回答你问题的更好的地方。我猜在同一距离可能会有两个coords,对吧?抱歉@Michal,我不知道。将来会在那里张贴。上面说找到最近的建筑物。他似乎想要一份升序名单,上面写着“找到最近的建筑物”。他似乎想要一份升序名单。我想我理解你在这里说的话,但我不确定我将如何实施它。你能给我举个例子吗?去掉math.sqrt和math.fabs。啊,我现在支持你。谢谢你的帮助!如果您在以后的某个时间点将此距离用于查找最近距离以外的其他目的,则需要执行sqrt(),但只针对最近的距离,而不是所有距离。我想我理解您在这里所说的,但我不确定如何实现它。你能给我举个例子吗?去掉math.sqrt和math.fabs。啊,我现在支持你。谢谢你的帮助!如果在以后的某个点将此距离用于查找最近距离以外的其他目的,则需要执行sqrt(),但仅针对最近的一个,而不是所有的距离。