淺析Python中的多條件排序?qū)崿F(xiàn)
多條件排序及itemgetter的應(yīng)用
曾經(jīng)客戶端的同事用as寫一大堆代碼來排序,在得知Python排序往往只需要一行,驚訝無比,遂對python產(chǎn)生濃厚的興趣。
之前在做足球的積分榜的時(shí)候需要用到多條件排序,如果積分相同,則按凈勝球,再相同按進(jìn)球數(shù),再相同按失球數(shù)。
即按積分P、凈勝球GD、進(jìn)球GS、失球GA這樣的順序。
在python中,排序非常方便,排序的參數(shù)主要有key、reverse。參數(shù)cmp不建議使用了,在python3.0被移除了,用參數(shù)key代替。
對于多條件排序,也非常簡單,只需要記住下面這句話就行。 即參數(shù)key指定的函數(shù)返回一個(gè)元組,多條件排序的順序?qū)凑赵M的順序。
看了下面的代碼你就明白了,下面是2010世界杯小組賽A組的積分榜。
teamitems = [{'team':'France' , 'P':1 , 'GD':-3 , 'GS':1 , 'GA':4}, {'team':'Uruguay' , 'P':7 , 'GD':4 , 'GS':4 , 'GA':0}, {'team':'SouthAfrica' , 'P':4 , 'GD':-2 , 'GS':3 , 'GA':5}, {'team':'Mexico' , 'P':4 , 'GD':1 , 'GS':3 , 'GA':2}] print sorted(teamitems ,key = lambda x:(x['P'],x['GD'],x['GS'],x['GA']),reverse=True)
輸出
[{'P': 7, 'GD': 4, 'GS': 4, 'GA': 0, 'team': 'Uruguay'}, {'P': 4, 'GD': 1, 'GS': 3, 'GA': 2, 'team': 'Mexico'}, {'P': 4, 'GD': -2, 'GS': 3, 'GA': 5, 'team': 'SouthAfrica'}, {'P': 1, 'GD': -3, 'GS': 1, 'GA': 4, 'team': 'France'}]
即小組排名是烏拉圭、墨西哥、南非、法國。
不過這樣一個(gè)個(gè)取字典的鍵值有點(diǎn)啰嗦,用itemgetter更簡潔優(yōu)雅,上面那句代碼可以用如下替換。
from operator import itemgetter print sorted(teamitems ,key = itemgetter('P','GD','GS','GA'),reverse=True)
有的升序有的降序的情況下怎么多條件排序
之前在統(tǒng)計(jì)導(dǎo)出各區(qū)服玩家消費(fèi)的時(shí)候需要進(jìn)行升序降序混搭的多條件排序。
需求是這樣的。區(qū)服從小到大排,如果區(qū)服相同,則按消費(fèi)從大到小排。
實(shí)現(xiàn)方法是利用python的sort算法是穩(wěn)定排序,對數(shù)據(jù)進(jìn)行多次排序,先排次要條件,后排主要條件。
還有一種更簡潔的一行流的方法,不過只有當(dāng)待排數(shù)據(jù)是數(shù)值的時(shí)候才有效。此方法利用相反數(shù)的性質(zhì),在前面加個(gè)負(fù)號。
下面上代碼。
#假設(shè)數(shù)據(jù)如下。 data = ''''' 區(qū)服,玩家id,累積消費(fèi) 3,a,2380 1,b,11900 4,e,3250 1,k,100 4,j,599 2,m,872 3,f,5560 1,y,2500 ''' items = [x.split(',') for x in filter(None,data.split('\n'))[1:]] #去掉空行和忽略首行并把字符串轉(zhuǎn)成二維數(shù)組 #方法一 items.sort(key=lambda x:int(x[2]),reverse=True)#先排消費(fèi) items.sort(key=lambda x:int(x[0]))#然后排區(qū)服 print '\n'.join([','.join(x) for x in items]) print '-----------' #方法二 items = sorted(items,key=lambda x:(int(x[0]),-int(x[2]))) print '\n'.join([','.join(x) for x in items])
相關(guān)文章
Django 創(chuàng)建后臺,配置sqlite3教程
今天小編就為大家分享一篇Django 創(chuàng)建后臺,配置sqlite3教程,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11python實(shí)現(xiàn)圖像高斯金字塔的示例代碼
這篇文章主要介紹了python實(shí)現(xiàn)圖像高斯金字塔的示例代碼,幫助大家更好的利用python處理圖片,感興趣的朋友可以了解下2020-12-12python抓取并保存html頁面時(shí)亂碼問題的解決方法
這篇文章主要介紹了python抓取并保存html頁面時(shí)亂碼問題的解決方法,結(jié)合實(shí)例形式分析了Python頁面抓取過程中亂碼出現(xiàn)的原因與相應(yīng)的解決方法,需要的朋友可以參考下2016-07-07Python+Selenium自動化環(huán)境搭建與操作基礎(chǔ)詳解
Selenium是如今最常用的自動化測試工具之一,支持快速開發(fā)自動化測試框架,且支持在多種瀏覽器上執(zhí)行測試。本文將介紹關(guān)于Selenium?Python自動化腳本環(huán)境搭建的相關(guān)資料,需要的朋友可以參考下2022-03-03對Python 簡單串口收發(fā)GUI界面的實(shí)例詳解
今天小編就為大家分享一篇對Python 簡單串口收發(fā)GUI界面的實(shí)例詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06python實(shí)現(xiàn)的登陸Discuz!論壇通用代碼分享
這篇文章主要介紹了python實(shí)現(xiàn)的登陸Discuz!論壇通用代碼分享,需要的朋友可以參考下2014-07-07Python寫的創(chuàng)建文件夾自定義函數(shù)mkdir()
這篇文章主要介紹了Python寫的創(chuàng)建文件夾自定義函數(shù)mkdir(),文件夾操作是編程中經(jīng)常需要的,mkdir函數(shù)更是經(jīng)典中的經(jīng)典,需要的朋友可以參考下2014-08-08