2013-02-12 143 views
-1

所以我有一個列表的列表找到[最大值,最小值在列表蟒列表值

alist = [[distance1,delta-angle1,object1],[distance2,delta-angle2,object2], [distance3,delta-angle3,object3],...] 

我想最大限度地爲「距離」和最小化「增量角」,這是是每個list的前兩個元素在alist中,並返回該特定列表。

警告:distance將是一個浮子和delta-angle將在度(-180:180)

的目標是選擇與「直的」角度的最長距離,但不只是最長或「直接「(或稱爲最小化角度變化)

編輯:我無法上傳圖像,所以這裏是一個鏈接。

http://imgur.com/a/b6KWM#YqGxdlu

我想避免「回去我在那裏」在這種特殊情況下。 作爲第二圖像中所示

IMAGE 2

第三圖像是理想的 - 並且由於我還沒有想到的一個更好的方式來說明這一點:最小化從當前軸承的角度變化(其Δ-角度是什麼被存儲在alist已經),增加可用線段的distance或長度(在下面的圖片這裏表示由上邊界端點)

IMAGE 3 http://imgur.com/a/b6KWM#YqGxdlu

+5

您定義的「最長距離與最直角」非常模糊 - 您能定義一個效用函數嗎?如果你有一對元素,你怎麼能決定哪一個更好? – 2013-02-12 00:51:45

+2

直到你真正給出了一個選擇哪一個更好的特定公式,你才能真正得到答案。有了這些之後,您可以在指定密鑰時使用排序。 (更多閱讀:http://wiki.python.org/moin/HowTo/Sorting/) – placeybordeaux 2013-02-12 01:01:42

+0

此外,爲什麼你認爲你需要「把[角度]放在[0 ... 360]的範圍內」最小化它?你真的想要89°被認爲比-45°更小嗎?如果不是,則將其保留爲[-180,180],並將「abs(角度)」而不是「角度」最小化。 – abarnert 2013-02-12 01:07:48

回答

0
alist = [[0,0,'b'],[-30,50,'a'], 
     [45,63,'d'],[100,170,'d'], 
     [-2,15,'p']] 

def mM(L): 
    x,y,_ = zip(*L) 
    return (min(x),max(y)) 

print mM(alist) 

導致

(-30, 170) 
+0

我不認爲提問者需要單獨的最大值和最小值,而是單獨的最大值/最小值的組合。 – Blckknght 2013-02-12 01:13:35

+0

這是正確的 - 我想(最大化,最小化)。 – 2013-02-12 01:23:51

+0

@ user1124683你有一種難以理解的表達方式。這是一個問題 – eyquem 2013-02-12 02:58:41

1

即使在澄清後,您的規則尚不明確。在編寫規則之前,你需要弄清楚你想要實現的規則。

如果規則很簡單,您應該可以編寫一個返回更高值的函數,匹配得越好。在這種情況下,您只需將該函數作爲key傳遞給max(或者您可以sortedheapq.nlargest等,這取決於您的實際使用情況)。

例如,如果規則只是「具有最大X分量的對象是最好的」,正如Blckknght所說,那只是distance*cos(angle)。當然,除了您可能需要最大的正向或負向X分量外,實際上它是​​。所以:

def best(alist): 
    return max(alist, key=lambda dao: abs(dao[0] * math.cos(dao[1])) 

(由於list的每個元素的distance, angle, object一個list,我每次叫這些元素dao的,所以dao[0]是距離等)

,如果你可以」是什麼不知道如何將規則轉換爲單個按鍵功能?

那麼,如果你可以編寫一個比較函數,比較兩個dao三元組並返回更大的三元組,你可以使用functools.cmp_to_key將它變成key函數。但是,真的,你可以編寫一個cmp函數,但不能寫一個key函數並不常見。

如果你需要更復雜的東西,你總是可以預過濾器列表,或裝飾排序,去除裝飾等

例如,在一個評論,你說:

的大多數效用來自長線,落在-90:0:90的範圍內,無論距離多長,其他一切效用都不大。

這是模糊的,但我們可以把它解釋的一種方法是:

  • 如果在區間[-90,90]有角度的任何對象,挑選出最長的那些對象。
  • 否則,選擇角度最小的物體。

可以寫,作爲一個關鍵的功能,但讓我們假裝我不知道怎麼了,想讓一切明確。編寫longest的關鍵功能很簡單 - 這只是dao[0]的關鍵。編寫smallest angle的關鍵函數也很簡單 - 這只是abs(dao[1])。因此:

def best(alist): 
    acutes = [[d, a, o] for [d, a, o] in alist if abs(a) <= 90] 
    if acutes: 
     return max(acutes, key=lambda dao: dao[0]) 
    else: 
     return min(alist, key=lambda dao: abs(dao[1]))