溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2020-03-27 06:54:06 來(lái)源:網(wǎng)絡(luò) 閱讀:3227 作者:梧桐0928 欄目:數(shù)據(jù)庫(kù)

在一個(gè)集合中獲取最大或者最小的n個(gè)元素,這時(shí)候就可以使用heapq模塊中有nlargest和nsmallest函數(shù)可以達(dá)到需求

heapq介紹:

    heapq模塊實(shí)現(xiàn)了python中的堆排序,并提供了有關(guān)方法。讓用Python實(shí)現(xiàn)排序算法有了簡(jiǎn)單快捷的方式。

>>> a=[1,2,5,9,72,-4]
>>> import heapq

#獲取列表中最小的兩個(gè)元素

>>> heapq.nsmallest(2,a)
[-4, 1]

#獲取列表中最大的兩個(gè)元素

>>> heapq.nlargest(2,a)
[72, 9]

其他函數(shù)說(shuō)明:

heappush()


heapq.heappush(heap, item):將item壓入到堆數(shù)組heap中。如果不進(jìn)行此步操作,后面的heappop()失效


heappop()


heapq.heappop(heap):從堆數(shù)組heap中取出最小的值,并返回。

>>> h=[]                    #定義一個(gè)list
>>> from heapq import *     #引入heapq模塊
>>> h
[]
>>> heappush(h,5)               #向堆中依次增加數(shù)值
>>> 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)                 #注意,如果不是壓入堆中,而是通過(guò)append追加一個(gè)數(shù)值
>>> h                           #堆的函數(shù)并不能操作這個(gè)增加的數(shù)值,或者說(shuō)它堆對(duì)來(lái)講是不存在的
[3, 5, 9, 1]
>>> heappop(h)                  #從h中能夠找到的最小值是3,而不是1
3
>>> heappush(h,2)               #這時(shí),不僅將2壓入到堆內(nèi),而且1也進(jìn)入了堆。
>>> h
[1, 2, 9, 5]
>>> heappop(h)                  #操作對(duì)象已經(jīng)包含了1
1

heapq.heappushpop(heap, item)


是上述heappush和heappop的合體,同時(shí)完成兩者的功能.注意:相當(dāng)于先操作了heappush(heap,item),然后操作heappop(heap)

>>> h
[1, 2, 9, 5]
>>> heappop(h)
1
>>> heappushpop(h,4)            #增加4同時(shí)刪除最小值2并返回該最小值,與下列操作等同:
2                               #heappush(h,4),heappop(h)
>>> h
[4, 5, 9]
heapq.heapify(x)
x必須是list,此函數(shù)將list變成堆,實(shí)時(shí)操作。從而能夠在任何情況下使用堆的函數(shù)。
>>> a=[3,6,1]
>>> heapify(a)                  #將a變成堆之后,可以對(duì)其操作
>>> heappop(a)
1
>>> b=[4,2,5]                   #b不是堆,如果對(duì)其進(jìn)行操作,顯示結(jié)果如下
>>> heappop(b)                  #按照順序,刪除第一個(gè)數(shù)值并返回,不會(huì)從中挑選出最小的
4
>>> heapify(b)                  #變成堆之后,再操作
>>> heappop(b)
2

heapq.heapreplace(heap, item)


是heappop(heap)和heappush(heap,item)的聯(lián)合操作。注意,與heappushpop(heap,item)的區(qū)別在于,順序不同,這里是先進(jìn)行刪除,后壓入堆

>>> a=[]
>>> heapreplace(a,3)            #如果list空,則報(bào)錯(cuò)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: index out of range
>>> heappush(a,3)
>>> a
[3]
>>> heapreplace(a,2)            #先執(zhí)行刪除(heappop(a)->3),再執(zhí)行加入(heappush(a,2))
3
>>> a
[2]
>>> heappush(a,5)  
>>> heappush(a,9)
>>> heappush(a,4)
>>> a
[2, 4, 9, 5]
>>> heapreplace(a,6)            #先從堆a(bǔ)中找出最小值并返回,然后加入6
2
>>> a
[4, 5, 9, 6]
>>> heapreplace(a,1)            #1是后來(lái)加入的,在1加入之前,a中的最小值是4
4
>>> 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]
在歸并排序中詳細(xì)演示了本函數(shù)的使用方法。
heapq.nlargest(n, iterable[, key]),heapq.nsmallest(n, iterable[, key])
獲取列表中最大、最小的幾個(gè)值。
>>> a   
[2, 4, 6]
>>> nlargest(2,a)
[6, 4]

注:其他函數(shù)出自https://github.com/qiwsir/algorithm/blob/master/heapq.md

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI