heapq取列表最大或最小值元素

來源:互聯網
上載者:User

標籤: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取列表最大或最小值元素

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.