在s中使用具有变化参数的函数作为键

2024-04-26 02:33:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在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

我想知道是否可以使用这个函数作为.sort()方法中的一个键,因为每个被检查的点都有一个不同的θ点?你知道吗

干杯


Tags: lambdakey函数列表if排序absmin
1条回答
网友
1楼 · 发布于 2024-04-26 02:33:32

是的。Read the documentation for ^{},就在那里。参数甚至与min的名称相同。你知道吗

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

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

  1. 为每个起点和终点生成所有点对(所有可能的点排列/组合,或通过一些更具选择性的初始配对算法)
  2. 根据他们的θ分数对他们进行排序

为此,您可以使用^{}生成点对(或者先排序以获得一致的点排序,然后使用^{},这样您就不会为点(A, B)(B, A)创建点对),然后使用theta对结果对进行排序以按相对角度对点对进行排序。例如:

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]theta值。你知道吗

相关问题 更多 >