Python cookbook(數(shù)據(jù)結(jié)構(gòu)與算法)實現(xiàn)對不原生支持比較操作的對象排序算法示例
本文實例講述了Python實現(xiàn)對不原生支持比較操作的對象排序算法。分享給大家供大家參考,具體如下:
問題:想在同一個類的實例之間做排序,但是它們并不原生支持比較操作。
解決方案:使用內(nèi)建的sorted()
函數(shù)可接受一個用來傳遞可調(diào)用對象的參數(shù)key,sorted利用該可調(diào)用對象返回的待排序?qū)ο笾械哪承┲祦肀容^對象。
from operator import attrgetter class User: def __init__(self, user_id): self.user_id = user_id def __repr__(self): return 'User({})'.format(self.user_id) # Example users = [User(23), User(3), User(99)] print(users) # Sort it by user-id used lambda表達(dá)式 print(sorted(users,key=lambda r:r.user_id)) # Sort it by user-id used operator.attrgetter() print(sorted(users, key=attrgetter('user_id')))
使用lambda表達(dá)式還是operator.attrgetter()
或許只是個人偏好,但是operator.attrgetter()
更快一些,而且具有允許同時提取多個字段值的能力。
這和針對字典的operator.itemgetter()
的使用類似。
from operator import attrgetter class User: def __init__(self, user_id,fname,lname): self.user_id = user_id self.fname=fname self.lname=lname def __repr__(self): return 'User({},{},{})'.format(self.user_id,self.fname,self.lname) # Example users = [User(23,'Brian','Jones'), User(3,'David','Beazley'), User(99,'Aig','Jones')] print(users) # Sort it by lname,fname used operator.attrgetter() print(sorted(users, key=attrgetter('lname','fname')))
>>> ================================ RESTART ================================ >>> [User(23,Brian,Jones), User(3,David,Beazley), User(99,Aig,Jones)] [User(3,David,Beazley), User(99,Aig,Jones), User(23,Brian,Jones)] >>>
最后,本節(jié)展示的技術(shù)同樣適用于min()
和max()
這樣的函數(shù):
>>> min(users,key=attrgetter('user_id')) User(3,David,Beazley) >>> max(users,key=attrgetter('user_id')) User(99,Aig,Jones) >>> max(users,key=attrgetter('fname')) User(3,David,Beazley)
(代碼摘自《Python Cookbook》)
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對大家Python程序設(shè)計有所幫助。
- Python實現(xiàn)多屬性排序的方法
- 基于python list對象中嵌套元組使用sort時的排序方法
- Python利用operator模塊實現(xiàn)對象的多級排序詳解
- Python中字典(dict)和列表(list)的排序方法實例
- python實現(xiàn)忽略大小寫對字符串列表排序的方法
- Python中對元組和列表按條件進行排序的方法示例
- Python編程對列表中字典元素進行排序的方法詳解
- python使用sorted函數(shù)對列表進行排序的方法
- Python對列表排序的方法實例分析
- Python3實現(xiàn)對列表按元組指定列進行排序的方法分析
- python實現(xiàn)對象列表根據(jù)某個屬性排序的方法詳解
相關(guān)文章
Python的Django框架實現(xiàn)數(shù)據(jù)庫查詢(不返回QuerySet的方法)
這篇文章主要介紹了Python的Django框架實現(xiàn)數(shù)據(jù)庫查詢(不返回QuerySet的方法)2020-05-05python數(shù)據(jù)處理67個pandas函數(shù)總結(jié)看完就用
這篇文章主要介紹了python數(shù)據(jù)處理67個pandas函數(shù)的梳理總結(jié),看完就可以去用了,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-11-11基于asyncio 異步協(xié)程框架實現(xiàn)收集B站直播彈幕
本文給大家分享的是基于asyncio 異步協(xié)程框架實現(xiàn)收集B站直播彈幕收集系統(tǒng)的簡單設(shè)計,并附上源碼,有需要的小伙伴可以參考下2016-09-09Python操作Redis數(shù)據(jù)庫的詳細(xì)教程與應(yīng)用實戰(zhàn)
Redis是一個高性能的鍵值存儲數(shù)據(jù)庫,支持多種類型的數(shù)據(jù)結(jié)構(gòu),如字符串、哈希表、列表、集合和有序集合等,在Python中,通過redis-py庫可以方便地操作Redis數(shù)據(jù)庫,本文將詳細(xì)介紹如何在Python代碼中操作Redis,需要的朋友可以參考下2024-08-08