2012-10-05 122 views
15

因此,我正在使用一些預先存在的比較器來比較兩個元組中的某些值,如果第一個大於第二個則返回true,否則返回false。下面是其中的一個代碼:使用比較函數進行排序

def cmpValue(subInfo1, subInfo2): 
    """ 
    Returns True if value in (value, work) tuple subInfo1 is GREATER than 
    value in (value, work) tuple in subInfo2 
    """ 
    # TODO... 
    if subInfo1[0] > subInfo2[0]: 
     return True 
    else: 
     return False 

現在,我有了上述比較的類型衆多的元組項目的字典。我想按相反的順序對它們進行排序,但我並不真正瞭解如何實現這一目標。我的想法是這樣的:

sortedDict = sorted(subjects, key=comparator, reverse = True) 

但我不知道該怎麼進入比較,因爲每個比較器有兩個參數(subInfo1,subInfo2)。 我無法更改比較器功能。

+3

比較功能在Python中不推薦使用;改用鍵功能。 –

+0

'if condition:return True else:return False' should''return condition'。 –

+1

詞典不保存順序。如果你想要一個已排序的字典,你應該使用集合模塊中的OrderedDict。 – Matt

回答

21

您正在通過比較器作爲key函數。你應該把它作爲cmp傳遞給它,它包含了某種函數,將它變成一個適當的比較器。

def make_comparator(less_than): 
    def compare(x, y): 
     if less_than(x, y): 
      return -1 
     elif less_than(y, x): 
      return 1 
     else: 
      return 0 
    return compare 

sortedDict = sorted(subjects, cmp=make_comparator(cmpValue), reverse=True) 

(儘管實際上,你應該使用主要功能:

sorted(subjects, operator.itemgetter(0), reverse=True) 

還要注意的是sortedDict不會真正成爲一個dict,所以這個名字是相當混亂。)

+6

此外,比較器不應該返回「真」或「假」,而是-1,0或1. – kindall

+0

@kindall:哎呀,錯過了。 –

+4

比較器的包裝器功能不錯。你也可以提到'functools.cmp_to_key'。 – kindall

相關問題