2016-12-14 57 views
1

所以我有一個健身函數(對於給定的一對參數只返回true或false),我想用它作爲排序可能參數列表的關鍵字。雖然通常情況下,我可以這樣做:使用具有附加參數的自定義方法排序?

sorted(possibleArguments, key = fitnessFunction) 

這裏probles是我的適應度函數如下:

def fitnessFunction(arg1, arg2, f): 
    return f(*arg1) < f(*arg2) 

當然,在方法我想用排序,用於計算適應度的函數是已知的,並且在排序期間不會改變,但是我能否以某種方式告訴Python,情況如何?我可以做些什麼:

如果是這樣,怎麼樣?

+0

相同類型的'arg1'和'arg2'對象?如果是這樣,您可以在該類中編寫'__gt__','__lt__'和'__eq__'函數來進行比較。 – Brobin

+0

@Brobin是的,他們是相同數量的花車每個 – Straightfw

+0

嗯,如果你在一個類中把它包起來,你可以使用這些方法的簡單元組。 – Brobin

回答

5

key不採用比較功能,它將列表中的元素轉換爲可比項目。

BTW它不再可能在Python 3的比較函數傳遞給sort(和__cmp__方法是從對象也消失了),所以你最好習慣它(這是很麻煩,你不得不如果等於返回0 ,如果負較少,正面的,如果比較大,有點像strcmp呢,過時了。你可以創建複雜的比較功能,但它們可以揭示不穩定的。我當然不會錯過它們)。

幸運的是,你有f()功能就足夠了。

你一定要做到這一點,你的情況:

sorted(possibleArguments, key = lambda x : f(*x)) 

攀比由sort函數來完成。不需要fitnessFunction

+0

哦,你說的沒錯!非常感謝 :) – Straightfw