標籤:heapq
在一個集合中擷取最大或者最小的n個元素,這時候就可以使用heapq模組中有nlargest和nsmallest函數可以達到需求
heapq介紹:
heapq模組實現了python中的堆排序,並提供了有關方法。讓用Python實現排序演算法有了簡單快捷的方式。
>>> a=[1,2,5,9,72,-4]>>> import heapq
#擷取列表中最小的兩個元素
>>> heapq.nsmallest(2,a)[-4, 1]
#擷取列表中最大的兩個元素
>>> heapq.nlargest(2,a)[72, 9]
其他函數說明:
heappush()
heapq.heappush(heap, item):將item壓入到堆數組heap中。如果不進行此步操作,後面的heappop()失效
heappop()
heapq.heappop(heap):從堆數組heap中取出最小的值,並返回。
>>> h=[] #定義一個list>>> from heapq import * #引入heapq模組>>> h[]>>> heappush(h,5) #向堆中依次增加數值>>> heappush(h,2)>>> heappush(h,3)>>> heappush(h,9)>>> h #h的值[2, 5, 3, 9]>>> heappop(h) #從h中刪除最小的,並返回該值2>>> h[3, 5, 9]>>> h.append(1) #注意,如果不是壓入堆中,而是通過append追加一個數值>>> h #堆的函數並不能操作這個增加的數值,或者說它堆對來講是不存在的[3, 5, 9, 1]>>> heappop(h) #從h中能夠找到的最小值是3,而不是13>>> heappush(h,2) #這時,不僅將2壓入到堆內,而且1也進入了堆。>>> h[1, 2, 9, 5]>>> heappop(h) #操作對象已經包含了11
heapq.heappushpop(heap, item)
是上述heappush和heappop的合體,同時完成兩者的功能.注意:相當於先操作了heappush(heap,item),然後操作heappop(heap)
>>> h[1, 2, 9, 5]>>> heappop(h)1>>> heappushpop(h,4) #增加4同時刪除最小值2並返回該最小值,與下列操作等同:2 #heappush(h,4),heappop(h)>>> h[4, 5, 9]heapq.heapify(x)x必須是list,此函數將list變成堆,即時操作。從而能夠在任何情況下使用堆的函數。>>> a=[3,6,1]>>> heapify(a) #將a變成堆之後,可以對其操作>>> heappop(a)1>>> b=[4,2,5] #b不是堆,如果對其進行操作,顯示結果如下>>> heappop(b) #按照順序,刪除第一個數值並返回,不會從中挑選出最小的4>>> heapify(b) #變成堆之後,再操作>>> heappop(b)2
heapq.heapreplace(heap, item)
是heappop(heap)和heappush(heap,item)的聯合操作。注意,與heappushpop(heap,item)的區別在於,順序不同,這裡是先進行刪除,後壓入堆
>>> a=[]>>> heapreplace(a,3) #如果list空,則報錯Traceback (most recent call last):File "<stdin>", line 1, in <module>IndexError: index out of range>>> heappush(a,3)>>> a[3]>>> heapreplace(a,2) #先執行刪除(heappop(a)->3),再執行加入(heappush(a,2))3>>> a[2]>>> heappush(a,5) >>> heappush(a,9)>>> heappush(a,4)>>> a[2, 4, 9, 5]>>> heapreplace(a,6) #先從堆a中找出最小值並返回,然後加入62>>> a[4, 5, 9, 6]>>> heapreplace(a,1) #1是後來加入的,在1加入之前,a中的最小值是44>>> a[1, 5, 9, 6]heapq.merge(*iterables)
舉例:
>>> a=[2,4,6] >>> b=[1,3,5]>>> c=merge(a,b)>>> list(c)[1, 2, 3, 4, 5, 6]在歸併排序中詳細示範了本函數的使用方法。heapq.nlargest(n, iterable[, key]),heapq.nsmallest(n, iterable[, key])擷取列表中最大、最小的幾個值。>>> a [2, 4, 6]>>> nlargest(2,a)[6, 4]
注:其他函數出自https://github.com/qiwsir/algorithm/blob/master/heapq.md
本文出自 “梧桐” 部落格,請務必保留此出處http://songhl.blog.51cto.com/1538319/1889219
heapq取列表最大或最小值元素