Python 使用具有更改参数的函数作为排序键

Python 使用具有更改参数的函数作为排序键,python,sorting,polar-coordinates,Python,Sorting,Polar Coordinates,我正在尝试根据点的极角对x-y平面中的点列表进行排序,从列表中选择具有最小y值的点 我曾经 min(listPts, key=lambda t: (t[1], -t[0])) 在listPts中查找最小y值的步骤 我有一个函数θ来求两点之间的角度 def theta(pointA, pointB): dx = pointB[0] - pointA[0] dy = pointB[1] - pointA[1] if abs(dx) < 1.e-6 and abs(d

我正在尝试根据点的极角对x-y平面中的点列表进行排序,从列表中选择具有最小y值的点

我曾经

min(listPts, key=lambda t: (t[1], -t[0]))
在listPts中查找最小y值的步骤

我有一个函数θ来求两点之间的角度

def theta(pointA, pointB):

    dx = pointB[0] - pointA[0]
    dy = pointB[1] - pointA[1]
    if abs(dx) < 1.e-6 and abs(dy) < 1.e-6:
        t = 0
    else:
         t = dy / (abs(dx) + abs(dy))
    if dx < 0:
        t = 2 - t
    elif dy < 0:
        t = 4 + t
    return t * 90
定义θ(点A,点B): dx=点B[0]-点A[0] dy=点B[1]-点A[1] 如果abs(dx)<1.e-6且abs(dy)<1.e-6: t=0 其他: t=dy/(abs(dx)+abs(dy)) 如果dx<0: t=2-t elif dy<0: t=4+t 返回t*90 我想知道是否可以在.sort()方法中将此函数用作键,因为每个被检查的点都会有不同的θ点B

干杯是的,就在那里。参数甚至与
min
的名称相同

更新:如果我理解你的真正问题,
θ
正在计算点之间的相对角度,你想根据点对的
θ
分数排序吗

如果这是正确的,您确实需要一个多步骤的过程:

  • 为每个起点和终点生成所有点对(所有可能的点排列/组合,或通过一些更具选择性的初始配对算法)
  • 根据他们的θ分数对他们进行排序
  • 为此,您可以使用生成对(或先排序以获得一致的点顺序,然后使用以不为点
    (A,B)
    (B,A)
    )创建对),然后使用
    θ对结果对排序,以按相对角度对对对进行排序。例如:

    import itertools
    from operator import itemgetter
    
    points = [(1, 0), (1, 1), (4, -3), (5, 5), (-2, 0), (-4, 1), (-3, -2)]
    
    points.sort(key=itemgetter(1, 0))  # Sorts by y then by x; caps theta to range(0, 180)
    
    point_pairs = itertools.combinations(points, 2)  # Generates unique pairs of points
    
    # Sort using key function that unpacks point pairs as arguments to theta
    point_pairs = sorted(point_pairs, key=lambda x: theta(*x))
    
    print(point_pairs)
    
    哪些产出:

    [((-2, 0), (1, 0)), ((-4, 1), (1, 1)), ..., ((1, 0), (-4, 1)), ((4, -3), (-3, -2))]
    

    [0.0,0.0,…,165.0,168.75]的
    θ
    值相对应

    谢谢你的回答,这个问题的措辞非常糟糕。我知道一个函数可以作为文档中的键来传递,但在这种情况下,需要为它正在排序的每个点(pointB)提供一个新的第二个参数@saleem:这就是
    cmp
    函数(仅在Py2中)。但是,如果您阅读文档(说真的,我在这里链接了文档),它会直接链接到一个实用程序,用于将旧式
    cmp
    函数转换为
    key
    函数,这很简单。@saleem:也就是说,阅读了您使用的函数后,它不是一个比较函数(返回值不是负值、0或正值以表示相对顺序)。这只是说任意两个点之间的距离有多大,角度不同。但你不能按相对角度对离散点进行排序;你如何处理位于不同位置但具有相同相对位置的两个点对?你想按相对位置对点对进行排序,这样一个点实际上会在结果中出现很多次吗?谢谢r一直伴随着我。我最终创建了一个新函数sortAng,它构造了一个字典,并将每个元组点与它与给定点和排序点所构造的角度配对。它可能不会在最佳时间运行,但现在似乎正在工作,我可以稍后调整