日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python 多条件 选择 算法_浅析Python中的多条件排序实现

發(fā)布時(shí)間:2024/8/23 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 多条件 选择 算法_浅析Python中的多条件排序实现 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

多條件排序及itemgetter的應(yīng)用曾經(jīng)客戶(hù)端的同事用as寫(xiě)一大堆代碼來(lái)排序,在得知Python排序往往只需要一行,驚訝無(wú)比,遂對(duì)python產(chǎn)生濃厚的興趣。

之前在做足球的積分榜的時(shí)候需要用到多條件排序,如果積分相同,則按凈勝球,再相同按進(jìn)球數(shù),再相同按失球數(shù)。

即按積分P、凈勝球GD、進(jìn)球GS、失球GA這樣的順序。

在python中,排序非常方便,排序的參數(shù)主要有key、reverse。參數(shù)cmp不建議使用了,在python3.0被移除了,用參數(shù)key代替。

對(duì)于多條件排序,也非常簡(jiǎn)單,只需要記住下面這句話就行。 即參數(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'}]

即小組排名是烏拉圭、墨西哥、南非、法國(guó)。

不過(guò)這樣一個(gè)個(gè)取字典的鍵值有點(diǎn)啰嗦,用itemgetter更簡(jiǎn)潔優(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)定排序,對(duì)數(shù)據(jù)進(jìn)行多次排序,先排次要條件,后排主要條件。

還有一種更簡(jiǎn)潔的一行流的方法,不過(guò)只有當(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])

總結(jié)

以上是生活随笔為你收集整理的python 多条件 选择 算法_浅析Python中的多条件排序实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。