python之排序操做及heapq模塊

說到排序,不少人可能第一想到的就是sorted,可是你可能不知道python中其實還有還就中方法喲,而且好多種場景下效率都會比sorted高。那麼接下來我就依次來介紹我所知道的排序操做。
sorted(iterable, *, key=None, reverse=False)python

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']
#總結上面兩種排序:字符串排序根據元素首字符的ASCII比較進行排序,
#數字類型按照大小排序,數字不能混合排序

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參數我就不做說明了,就是把結果進行倒序,可用做降序排列
介紹一種比lambda效率高的方式:
operator模塊中的方法itemgetter
>>> itemgetter(1)('ABCDEFG')
'B'
>>> itemgetter(1,3,5)('ABCDEFG')
('B', 'D', 'F')
>>> itemgetter(slice(2,None))('ABCDEFG')
'CDEFG
運用到上述代碼
print(sorted(list3,key=itemgetter('age','price')))    #結果同上但效率會比較高

接下來的排序操做涉及到一個很是重要的一種數據結構——堆,不過今天我主要介紹這個模塊中的方法,具體什麼是堆,及其還有一種數據結構——棧,有時間我會專門寫一篇文章來介紹。
heapq(Python內置的模塊)api

__all__ = ['heappush', 'heappop', 'heapify', 'heapreplace', 'merge',
           'nlargest', 'nsmallest', 'heappushpop']

接下來咱們一一介紹。
nlargest與nsmallest,經過字面意思能夠看出方法大體的做用,接下來動手測驗數據結構

nlargest(n, iterable, key=None)
nsmallest(n, iterable, key=None)
#n:查找個數    iterable:可迭代對象    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')))
#以上代碼輸出結果同sorted

print(heapq.nsmallest(len(list1),list1))
print(heapq.nsmallest(len(list2),list2))
print(heapq.nsmallest(len(list3),list3,key=itemgetter('age','price')))
#結果是降序
[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
堆結構特色:heap[0]永遠是最小的元素(利用此特性排序)app

heapify:對序列進行堆排序,
heappush:在堆序列中添加值
heappop:刪除最小值並返回
heappushpop:添加並刪除堆中最小值且返回,添加以後刪除
heapreplace:添加並刪除隊中最小值且返回,刪除以後添加

nums=[54,23,64.,323,53,3,212,453,65]
heapify(nums)    #先進行堆排序
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:合併多個序列code

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]
#發現輸出結果不只進行了合併,還進行了排序,有意思哈,但是換個代碼測驗,你再看一下

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]
#大家確定想這是什麼鬼,一點都沒有頭緒,其實通過個人屢次測驗,仍是有規律的,可是因爲沒有什麼做用就不大篇幅說明了,喜歡刨根問題的小夥伴能夠嘗試本身思考一下。

小夥伴們有沒有想我爲什麼介紹這個模塊,而且和排序放在一塊兒呢,其實在不少時候咱們須要找序列中的前幾個最大值或者最小值,使用此模塊中的方法是最好不過的了。
若是須要所有排序咱們使用sorted,須要查找最大或最小的幾個或者多個咱們使用alargest/asmallest,查找最大最小使用max/min對象

相關文章
相關標籤/搜索