淺析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ù)號(hào)。
下面上代碼。
#假設(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)文章
Python實(shí)現(xiàn)將xml導(dǎo)入至excel
本文給大家講解的是使用Python的Testlink實(shí)現(xiàn)將實(shí)現(xiàn)將xml導(dǎo)入至excel表格中,方法非常的簡單,另外附上其他小伙伴的方法,有需要的童鞋們可以參考下。2015-11-11
Django ORM判斷查詢結(jié)果是否為空,判斷django中的orm為空實(shí)例
這篇文章主要介紹了Django ORM判斷查詢結(jié)果是否為空,判斷django中的orm為空實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07
使用mypy對python程序進(jìn)行靜態(tài)檢查
大家好,本篇文章主要講的是使用mypy對python程序進(jìn)行靜態(tài)檢查,感興趣的同學(xué)快來看一看吧,對你有幫助的話記得收藏一下哦2021-11-11
Python Locust負(fù)載測試工具安裝配置使用詳解
本文將提供有關(guān)Python Locust的全面指南,包括安裝和配置、基本概念、性能測試、任務(wù)編寫、報(bào)告生成以及實(shí)際應(yīng)用場景,將通過豐富的示例代碼來幫助深入理解Locust的使用2024-01-01
Python 實(shí)現(xiàn)任意區(qū)域文字識(shí)別(OCR)操作
這篇文章主要介紹了Python 實(shí)現(xiàn)任意區(qū)域文字識(shí)別(OCR)操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03
Pandas數(shù)據(jù)合并的兩種實(shí)現(xiàn)方法
本文主要介紹了Pandas數(shù)據(jù)合并的兩種實(shí)現(xiàn)方法,DataFrame數(shù)據(jù)合并主要使用merge()方法和concat()方法,具有一定的參考價(jià)值,感興趣的可以了解一下2023-11-11

