2013-01-13 62 views
7

我是編程新手,現在我正在使用python編寫聯賽表。我想以第一分數排序我的聯盟,如果有兩個球隊的積分相同,我想按球門差異對他們進行排序,如果他們有相同的球門差異,我想按名稱排序。按python中的多個條件進行排序

第一個條件是很容易的,由下面的工作:

table.sort(reverse=True, key=Team.getPoints) 

如何插入以下兩種情況?

+0

你可能想閱讀[Python Sorting HowTo](http://wiki.python.org/moin/HowTo/Sorting/)。 (實際上,目前我在加載時遇到了問題,但總有[Google緩存](http://webcache.googleusercontent.com/search?q=cache:GjjYVDIjFi0J:wiki.python.org/moin/HowTo/ Sorting/+&cd = 1&hl = en&ct = clnk&gl = us&client = firefox-a)) – kojiro

+0

哇。我有完全相同的任務:在聯盟中對球隊進行排序) – imkost

+0

[按兩個條件排序Python列表]可能的重複(http://stackoverflow.com/questions/5212870/sorting-a-python-list-by-two-criteria ) – GingerPlusPlus

回答

4

先按名稱對列表進行排序,然後再按分數差異進行排序。 Python的sort是穩定的,這意味着它將保持比較相等的元素的順序。

10

key功能優先級遞減的順序返回一個元組,與項目:

table.sort(reverse=True, key=lambda team: (Team.getPoints(team), 
              Team.getGoalDifference(team), 
              Team.getName(team)) 

或者,你能記得從算法101的仿真陳述,並利用這一事實.sort()穩定如果它們相等,則不會更改列表中項目的相對順序。這意味着你可以在優先級遞增的順序三次排序,:

table.sort(reverse=True, key=Team.getName) 
table.sort(reverse=True, key=Team.getGoalDifference) 
table.sort(reverse=True, key=Team.getPoints) 

這會慢一些,但可以讓你輕鬆指定是否每一步應該在reverse或不能這樣做。這可沒有多個排序使用cmp_to_key()傳遞來完成,但比較功能將是平凡的,是這樣的:

def team_cmp(t1, t2): 
    for key_func, reverse in [(Team.getName, True), 
           (Team.getGoalDifference, True), 
           (Team.getPoints, True)]: 
     result = cmp(key_func(t1), key_func(t2)) 
     if reverse: result = -result; 
     if result: return result 
    return 0 

table.sort(functools.cmp_to_key(team_cmp)) 

(免責聲明:以上從存儲器寫入,未經測試)重點是「沒有多遍」 ,這並不一定意味着「更快」。比較函數和cmp_to_key()的開銷都在Python中實現(與list.sort()operator.itemgetter()相對應,它應該是C核心的一部分)可能會很重要。

另外,您不需要創建虛擬函數來傳遞參數key。您可以直接訪問屬性,使用:

table.sort(key=lambda t: t.points) 

attrgetter操作包裝:

table.sort(key=attrgetter('points')) 
+1

是不是第一個與第二個有點不同?它將'reverse = True'應用於整個元組,而三步版本僅將其應用於點。 – DSM

+0

@DSM它是,我試圖做一個例子,你*可以*改變各個步驟的順序,但我想這不是明顯和混亂。 – millimoose

+0

那麼,難道你不能只用'* -1'來扭轉一個領域? –

0

Python的排序算法是Timsort其中,作爲ACEfanatic02指出,是stable這意味着順序被保存。 This link對其工作原理有很好的視覺解釋。

+0

因此,蒂姆彼得斯已經變得不朽。 – millimoose

相關問題