2012-06-09 28 views
1

我有一個函數,它將參數作爲2個對象:ab 函數檢查(使用非常長的算法)哪個對象更好。Python,使用比較函數查找最佳對象

如果是更好的返回-1,如果b是更好的,它返回1,如果他們綁返回0

我的問題是:

我在列表中有這些對象的21。

我需要找出來,用上面的功能(該功能不能 改變,唯一的方法是比較2個對象,這是一個非常複雜的 和長算法),其中這21個目標之一就是最好的。

我試了幾個小時想如何有效地做到這一點,沒有做太多次相同的比較,如何編寫一個算法,將找出哪一個是最好的(如果兩個是綁在一起,他們都是最好的,哪一個並不重要,儘管我認爲甚至不可能有平局發生),而且我不能拿出任何好的東西。

函數的名稱是handCompare(a, b) 對象在一個名爲Combos列表中找到,len(combos)是21 我需要一個算法,將在連擊列表中找到了最好的項目

感謝您的閱讀,我希望你可以幫助:)

+1

使用你的函數實現排序方法('__gt __()','__lt __()','__eq __()'),然後使用'list.sort()'有什麼問題? –

+0

你是什麼意思?你明白我的問題嗎?排序如何相關? – Omer

+1

如果使用比較對項目進行排序,最後一項將是最好的。 –

回答

7

如果您更改hand_compare()返回1如果a更好,並且-1如果b更好,則這將起作用。

import functools 
best = max(combos, key=functools.cmp_to_key(hand_compare)) 
+0

應該分鐘()由於'hand_compare(A,B)<0'如果'A'是更好 – jfs

+0

相應編輯。謝謝! – user545424

+0

我真的不明白,你在這裏做什麼,複製粘貼它沒有工作,所以我需要了解它,以解決它...... 你能解釋一下嗎? – Omer

1

的最直接方法:創建每一個的一個對象,與比較函數作爲__cmp__(蟒2.X)或定義__lt____eq__(蟒3.X)。將每個存儲在名爲list_的列表中。使用min(list_)查找最小值的值。

如果可行,可能會有所幫助的優化:如果您可以想出一種將對象映射到(可能較大)整數的方法,例如x的整數是< y的整數,如果原始對象ox是原始對象oy,然後取一個整數的分鐘。如果它適用於你的類型,這應該可以稍微加快速度。