天天看點

飄逸的python - 多條件排序及itemgetter的應用

曾經用戶端的同僚用as寫一大堆代碼來排序,在得知python排序往往隻需要一行,驚訝無比,遂對python産生濃厚的興趣。

之前在做足球的積分榜的時候需要用到多條件排序,如果積分相同,則按淨勝球,再相同按進球數,再相同按失球數。

即按積分P、淨勝球GD、進球GS、失球GA這樣的順序。

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

對于多條件排序,也非常簡單,隻需要記住下面這句話就行。 即

參數key指定的函數傳回一個元組,多條件排序的順序将按照元組的順序。

看了下面的代碼你就明白了,下面是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'}]

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

不過這樣一個個取字典的鍵值有點啰嗦,用itemgetter更簡潔優雅,上面那句代碼可以用如下替換。

from operator import itemgetter
print sorted(teamitems ,key = itemgetter('P','GD','GS','GA'),reverse=True)