2016-05-18 87 views
-2

我试着根据它们的极角对x-y平面中的点列表进行排序,并从具有最小y值的列表中选择一个点。使用函数作为关键参数

我用

min(listPts, key=lambda t: (t[1], -t[0])) 

找到listPts

我有一个函数THETA找到两点

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 

之间的角度最小的y值我想知道如果其可能以某种方式使用这个函数作为.sort()方法中的一个关键点,因为每个被检查的点对于theta都会有不同的pointB?

欢呼声

回答

1

是的。 Read the documentation for list.sort,它就在那里。参数甚至与min具有相同的名称。

更新:如果我理解你真正的问题,theta被计算点之间的相对角度,和你想点基于莫名其妙的theta得分排序?

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

  1. 为每一个原点和终点都指向对(或者所有可能的点排列/组合,或者通过一些初始配对算法,该算法根据他们的THETA分数更具有选择性)
  2. 排序对

要做到这一点,您可以使用itertools.permutations生成对(或排序首先得到一些一致点排序,然后使用itertools.combinations,因此您不要为点(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值。

+0

感谢您的回复,这个问题的措辞非常糟糕。我知道一个函数可以作为文档中的一个键传递,但在这种情况下,它需要为它正在排序的每个点(pointB)提供一个新的第二个参数? – saleem

+0

@saleem:这是'cmp'功能(仅在Py2中)。但是,如果你阅读文档(认真地说,我在这里链接了文档),它直接链接到一个将旧式'cmp'函数转换为'键'函数的实用程序,这是微不足道的。 – ShadowRanger

+0

@saleem:这就是说,读过你正在使用的函数,它不是一个比较函数(返回值不是负数,0或正值表示相对顺序)。这只是说明两点之间有多远,角度明智。但是你不能在相对角度上对离散点进行排序;你如何处理不同位置的2点对,但具有相同的相对位置?你是否希望点对按相对位置排序,所以单点实际上会在结果中出现多次? – ShadowRanger