我是編程新手,現在我正在使用python編寫聯賽表。我想以第一分數排序我的聯盟,如果有兩個球隊的積分相同,我想按球門差異對他們進行排序,如果他們有相同的球門差異,我想按名稱排序。按python中的多個條件進行排序
第一個條件是很容易的,由下面的工作:
table.sort(reverse=True, key=Team.getPoints)
如何插入以下兩種情況?
我是編程新手,現在我正在使用python編寫聯賽表。我想以第一分數排序我的聯盟,如果有兩個球隊的積分相同,我想按球門差異對他們進行排序,如果他們有相同的球門差異,我想按名稱排序。按python中的多個條件進行排序
第一個條件是很容易的,由下面的工作:
table.sort(reverse=True, key=Team.getPoints)
如何插入以下兩種情況?
先按名稱對列表進行排序,然後再按分數差異進行排序。 Python的sort
是穩定的,這意味着它將保持比較相等的元素的順序。
有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'))
是不是第一個與第二個有點不同?它將'reverse = True'應用於整個元組,而三步版本僅將其應用於點。 – DSM
@DSM它是,我試圖做一個例子,你*可以*改變各個步驟的順序,但我想這不是明顯和混亂。 – millimoose
那麼,難道你不能只用'* -1'來扭轉一個領域? –
因此,蒂姆彼得斯已經變得不朽。 – millimoose
你可能想閱讀[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
哇。我有完全相同的任務:在聯盟中對球隊進行排序) – imkost
[按兩個條件排序Python列表]可能的重複(http://stackoverflow.com/questions/5212870/sorting-a-python-list-by-two-criteria ) – GingerPlusPlus