python中heapq堆排算法的實(shí)現(xiàn)
一、創(chuàng)建堆
heapq有兩種方式創(chuàng)建堆, 一種是使用一個(gè)空列表,然后使用heapq.heappush()函數(shù)把值加入堆中,另外一種就是使用heap.heapify(list)轉(zhuǎn)換列表成為堆結(jié)構(gòu)
import heapq # 第一種 """ 函數(shù)定義: heapq.heappush(heap, item) - Push the value item onto the heap, maintaining the heap invariant. heapq.heappop(heap) - Pop and return the smallest item from the heap, maintaining the heap invariant. If the heap is empty, IndexError is raised. To access the smallest item without popping it, use heap[0]. """ nums = [2, 3, 5, 1, 54, 23, 132] heap = [] for num in nums: heapq.heappush(heap, num) # 加入堆 print(heap[0]) # 如果只是想獲取最小值而不是彈出,使用heap[0] print([heapq.heappop(heap) for _ in range(len(nums))]) # 堆排序結(jié)果 # out: [1, 2, 3, 5, 23, 54, 132] # 第二種 nums = [2, 3, 5, 1, 54, 23, 132] heapq.heapify(nums) print([heapq.heappop(heap) for _ in range(len(nums))]) # 堆排序結(jié)果 # out: [1, 2, 3, 5, 23, 54, 132]
heapq 模塊還有一個(gè)??heapq.merge(*iterables)?
? 方法,用于合并多個(gè)排序后的序列成一個(gè)排序后的序列, 返回排序后的值的迭代器。
類(lèi)似于??sorted(itertools.chain(*iterables))?
?,但返回的是可迭代的。
""" 函數(shù)定義: heapq.merge(*iterables) - Merge multiple sorted inputs into a single sorted output (for example, merge timestamped entries from multiple log files). Returns an iterator over the sorted values. - Similar to sorted(itertools.chain(*iterables)) but returns an iterable, does not pull the data into memory all at once, and assumes that each of the input streams is already sorted (smallest to largest). """ import heapq num1 = [32, 3, 5, 34, 54, 23, 132] num2 = [23, 2, 12, 656, 324, 23, 54] num1 = sorted(num1) num2 = sorted(num2) res = heapq.merge(num1, num2) print(list(res))
二、訪問(wèn)堆內(nèi)容
堆創(chuàng)建好后,可以通過(guò)`heapq.heappop() 函數(shù)彈出堆中最小值。
import heapq nums = [2, 43, 45, 23, 12] heapq.heapify(nums) print(heapq.heappop(nums)) # out: 2 # 如果需要所有堆排序后的元素 result = [heapq.heappop(nums) for _ in range(len(nums))] print(result) # out: [12, 23, 43, 45]
如果需要?jiǎng)h除堆中最小元素并加入一個(gè)元素,可以使用??heapq.heaprepalce()?
? 函數(shù)
import heapq nums = [1, 2, 4, 5, 3] heapq.heapify(nums) heapq.heapreplace(nums, 23) print([heapq.heappop(nums) for _ in range(len(nums))]) # out: [2, 3, 4, 5, 23]
三、獲取堆最大或最小值
如果需要獲取堆中最大或最小的范圍值,則可以使用??heapq.nlargest()?
?? 或??heapq.nsmallest()?
? 函數(shù)
""" 函數(shù)定義: heapq.nlargest(n, iterable[, key])? - Return a list with the n largest elements from the dataset defined by iterable. - key if provided, specifies a function of one argument that is used to extract a comparison key from each element in the iterable: key=str.lower - Equivalent to: sorted(iterable, key=key, reverse=True)[:n] """ import heapq nums = [1, 3, 4, 5, 2] print(heapq.nlargest(3, nums)) print(heapq.nsmallest(3, nums)) """ 輸出: [5, 4, 3] [1, 2, 3] """
這兩個(gè)函數(shù)還接受一個(gè)key參數(shù),用于dict或其他數(shù)據(jù)結(jié)構(gòu)類(lèi)型使用
import heapq from pprint import pprint portfolio = [ {'name': 'IBM', 'shares': 100, 'price': 91.1}, {'name': 'AAPL', 'shares': 50, 'price': 543.22}, {'name': 'FB', 'shares': 200, 'price': 21.09}, {'name': 'HPQ', 'shares': 35, 'price': 31.75}, {'name': 'YHOO', 'shares': 45, 'price': 16.35}, {'name': 'ACME', 'shares': 75, 'price': 115.65} ] cheap = heapq.nsmallest(3, portfolio, key=lambda s: s['price']) expensive = heapq.nlargest(3, portfolio, key=lambda s: s['price']) pprint(cheap) pprint(expensive) """ 輸出: [{'name': 'YHOO', 'price': 16.35, 'shares': 45}, {'name': 'FB', 'price': 21.09, 'shares': 200}, {'name': 'HPQ', 'price': 31.75, 'shares': 35}] [{'name': 'AAPL', 'price': 543.22, 'shares': 50}, {'name': 'ACME', 'price': 115.65, 'shares': 75}, {'name': 'IBM', 'price': 91.1, 'shares': 100}] """
四、heapq應(yīng)用
實(shí)現(xiàn)heap堆排序算法:
>>> def heapsort(iterable): ... h = [] ... for value in iterable: ... heappush(h, value) ... return [heappop(h) for i in range(len(h))] ... >>> heapsort([1, 3, 5, 7, 9, 2, 4, 6, 8, 0]) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
該算法和??sorted(iterable)?
? 類(lèi)似,但是它是不穩(wěn)定的。
堆的值可以是元組類(lèi)型,可以實(shí)現(xiàn)對(duì)帶權(quán)值的元素進(jìn)行排序。
>>> h = [] >>> heappush(h, (5, 'write code')) >>> heappush(h, (7, 'release product')) >>> heappush(h, (1, 'write spec')) >>> heappush(h, (3, 'create tests')) >>> heappop(h) (1, 'write spec')
到此這篇關(guān)于python中heapq堆排算法的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)python heapq 堆內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python人工智能human?learn繪圖創(chuàng)建機(jī)器學(xué)習(xí)模型
這篇文章主要為大家介紹了python人工智能human?learn繪圖就可以創(chuàng)建機(jī)器學(xué)習(xí)模型的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-11-11python爬蟲(chóng)開(kāi)發(fā)之urllib模塊詳細(xì)使用方法與實(shí)例全解
這篇文章主要介紹了python爬蟲(chóng)開(kāi)發(fā)之urllib模塊詳細(xì)使用方法與實(shí)例全解,需要的朋友可以參考下2020-03-03從零開(kāi)始的TensorFlow+VScode開(kāi)發(fā)環(huán)境搭建的步驟(圖文)
這篇文章主要介紹了從零開(kāi)始的TensorFlow+VScode開(kāi)發(fā)環(huán)境搭建的步驟(圖文),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08python opencv實(shí)現(xiàn)gif圖片分解的示例代碼
這篇文章主要介紹了python opencv實(shí)現(xiàn)gif圖片分解的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12Python入門(mén)必須知道的11個(gè)知識(shí)點(diǎn)
這篇文章主要為大家詳細(xì)介紹了Python入門(mén)必須知道的11個(gè)知識(shí)點(diǎn),幫助更好地了解python,感興趣的小伙伴們可以參考一下2018-03-03使用pycharm將自己項(xiàng)目代碼上傳github(小白教程)
github是一個(gè)代碼托管平臺(tái),本文主要介紹了使用pycharm將自己項(xiàng)目代碼上傳github,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11超全Python圖像處理講解(多模塊實(shí)現(xiàn))
這篇文章主要介紹了超全Python圖像處理講解(多模塊實(shí)現(xiàn)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04pytorch實(shí)現(xiàn)Tensor變量之間的轉(zhuǎn)換
今天小編就為大家分享一篇pytorch實(shí)現(xiàn)Tensor變量之間的轉(zhuǎn)換,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02