2016-05-18 138 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