Python 使用具有更改参数的函数作为排序键
我正在尝试根据点的极角对x-y平面中的点列表进行排序,从列表中选择具有最小y值的点 我曾经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
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,它构造了一个字典,并将每个元组点与它与给定点和排序点所构造的角度配对。它可能不会在最佳时间运行,但现在似乎正在工作,我可以稍后调整