詳解python之heapq模塊及排序操作
說到排序,很多人可能第一想到的就是sorted,但是你可能不知道python中其實(shí)還有還就中方法喲,并且好多種場景下效率都會(huì)比sorted高。那么接下來我就依次來介紹我所知道的排序操作。
sorted(iterable, *, key=None, reverse=False)
list1=[1,6,4,3,9,5] list2=['12','a6','4','c34','b9','5'] print(sorted(list1)) #[1, 3, 4, 5, 6, 9] print(sorted(list2)) #['12', '4', '5', 'a6', 'b9', 'c34'] #總結(jié)上面兩種排序:字符串排序根據(jù)元素首字符的ASCII比較進(jìn)行排序, #數(shù)字類型按照大小排序,數(shù)字不能混合排序 list3=[ {'name':'jim','age':23,'price':500}, {'name':'mase','age':23,'price':600}, {'name':'tom','age':25,'price':2000}, {'name':'alice','age':22,'price':300}, {'name':'rose','age':21,'price':2400}, ] print(sorted(list3,key=lambda s:(s['age'],s['price']))) #[{'name': 'rose', 'age': 21, 'price': 2400}, {'name': 'alice', 'age': 22, 'price': 300}, {'name': 'jim', 'age': 23, 'price': 500}, {'name': 'mase', 'age': 23, 'price': 600}, {'name': 'tom', 'age': 25, 'price': 2000}] 最后的reverse參數(shù)我就不作說明了,就是把結(jié)果進(jìn)行倒序,可用作降序排列 介紹一種比lambda效率高的方式: operator模塊中的方法itemgetter >>> itemgetter(1)('ABCDEFG') 'B' >>> itemgetter(1,3,5)('ABCDEFG') ('B', 'D', 'F') >>> itemgetter(slice(2,None))('ABCDEFG') 'CDEFG 運(yùn)用到上述代碼 print(sorted(list3,key=itemgetter('age','price'))) #結(jié)果同上但效率會(huì)比較高
接下來的排序操作涉及到一個(gè)非常重要的一種數(shù)據(jù)結(jié)構(gòu)——堆,不過今天我主要介紹這個(gè)模塊中的方法,具體什么是堆,及其還有一種數(shù)據(jù)結(jié)構(gòu)——棧,有時(shí)間我會(huì)專門寫一篇文章來介紹。
heapq(Python內(nèi)置的模塊)
__all__ = ['heappush', 'heappop', 'heapify', 'heapreplace', 'merge',
'nlargest', 'nsmallest', 'heappushpop']
接下來我們一一介紹。
nlargest與nsmallest,通過字面意思可以看出方法大致的作用,接下來動(dòng)手測(cè)驗(yàn)
nlargest(n, iterable, key=None) nsmallest(n, iterable, key=None) #n:查找個(gè)數(shù) iterable:可迭代對(duì)象 key:同sorted list1=[1,6,4,3,9,5] list2=['12','a6','4','c34','b9','5'] list3=[ {'name':'jim','age':23,'price':500}, {'name':'mase','age':23,'price':600}, {'name':'tom','age':25,'price':2000}, {'name':'alice','age':22,'price':300}, {'name':'rose','age':21,'price':2400}, ] from operator import itemgetter import heapq print(heapq.nlargest(len(list1),list1)) print(heapq.nlargest(len(list2),list2)) print(heapq.nlargest(len(list3),list3,key=itemgetter('age','price'))) #以上代碼輸出結(jié)果同sorted print(heapq.nsmallest(len(list1),list1)) print(heapq.nsmallest(len(list2),list2)) print(heapq.nsmallest(len(list3),list3,key=itemgetter('age','price'))) #結(jié)果是降序 [1, 3, 4, 5, 6, 9] ['12', '4', '5', 'a6', 'b9', 'c34'] [{'name': 'rose', 'age': 21, 'price': 2400}, {'name': 'alice', 'age': 22, 'price': 300}, {'name': 'jim', 'age': 23, 'price': 500}, {'name': 'mase', 'age': 23, 'price': 600}, {'name': 'tom', 'age': 25, 'price': 2000}]
heappush,heappop,heapify,heapreplace,heappushpop
堆結(jié)構(gòu)特點(diǎn):heap[0]永遠(yuǎn)是最小的元素(利用此特性排序)
heapify:對(duì)序列進(jìn)行堆排序,
heappush:在堆序列中添加值
heappop:刪除最小值并返回
heappushpop:添加并刪除堆中最小值且返回,添加之后刪除
heapreplace:添加并刪除隊(duì)中最小值且返回,刪除之后添加
nums=[54,23,64.,323,53,3,212,453,65] heapify(nums) #先進(jìn)行堆排序 print(heappop(nums)) #3 print(heappush(nums,50)) #添加操作,返回None print(heappushpop(nums,10)) #由于是添加后刪除,所以返回10 print(heappop(nums)) #23 print(heapreplace(nums,10)) #和heappushpop,返回50 print(nums) #[10, 53, 54, 65, 323, 64.0, 212, 453]
merge:合并多個(gè)序列
list1 = [1, 2, 3, 4, 5, 12] set1 = {2, 3, 9, 23, 54} s = list(merge(list1,set1)) print(s) #[1, 2, 2, 3, 3, 4, 5, 9, 12, 54, 23] #發(fā)現(xiàn)輸出結(jié)果不僅進(jìn)行了合并,還進(jìn)行了排序,有意思哈,可是換個(gè)代碼測(cè)驗(yàn),你再看一下 list1 = [31, 2, 83, 24, 5, 12] set1 = {2, 83, 9, 23, 54} s = list(merge(list1,set1)) print(s) #[2, 9, 31, 2, 83, 24, 5, 12, 83, 54, 23] #你們肯定想這是什么鬼,一點(diǎn)都沒有頭緒,其實(shí)經(jīng)過我的多次測(cè)驗(yàn),還是有規(guī)律的,但是由于沒有什么作用就不大篇幅說明了,喜歡刨根問題的小伙伴可以嘗試自己思考一下。
小伙伴們有沒有想我為何介紹這個(gè)模塊,并且和排序放在一起呢,其實(shí)在很多時(shí)候我們需要找序列中的前幾個(gè)最大值或者最小值,使用此模塊中的方法是最好不過的了。
如果需要全部排序我們使用sorted,需要查找最大或最小的幾個(gè)或者多個(gè)我們使用alargest/asmallest,查找最大最小使用max/min
相關(guān)文章
python二進(jìn)制串轉(zhuǎn)字符串的方法詳解
這篇文章主要介紹了python二進(jìn)制串轉(zhuǎn)字符串的方法詳解,使用json,可以自動(dòng)檢測(cè)編碼,但需要注意的是,它返回的是python對(duì)象,不一定是字符串,具體是什么對(duì)象要視原始內(nèi)容而定,需要的朋友可以參考下2023-11-11python 按鈕點(diǎn)擊關(guān)閉窗口的實(shí)現(xiàn)
這篇文章主要介紹了python 按鈕點(diǎn)擊關(guān)閉窗口的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03pytorch中model.named_parameters()與model.parameters()解讀
這篇文章主要介紹了pytorch中model.named_parameters()與model.parameters()使用及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11利用Python pandas對(duì)Excel進(jìn)行合并的方法示例
這篇文章主要給大家介紹了關(guān)于利用Python pandas對(duì)Excel進(jìn)行合并的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11Pytorch中實(shí)現(xiàn)只導(dǎo)入部分模型參數(shù)的方式
今天小編就為大家分享一篇Pytorch中實(shí)現(xiàn)只導(dǎo)入部分模型參數(shù)的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-01-01Django項(xiàng)目如何配置Memcached和Redis緩存?選擇哪個(gè)更有優(yōu)勢(shì)?
這篇文章主要介紹了Django項(xiàng)目如何配置Memcached和Redis緩存,幫助大家更好的理解和學(xué)習(xí)使用django框架,感興趣的朋友可以了解下2021-04-04python實(shí)現(xiàn)同時(shí)給多個(gè)變量賦值的方法
這篇文章主要介紹了python實(shí)現(xiàn)同時(shí)給多個(gè)變量賦值的方法,涉及Python中變量賦值的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04