日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python标准库模块_Python标准库模块之heapq

發布時間:2023/12/2 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python标准库模块_Python标准库模块之heapq 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

該模塊提供了堆排序算法的實現。堆是二叉樹,最大堆中父節點大于或等于兩個子節點,最小堆父節點小于或等于兩個子節點。

創建堆

heapq有兩種方式創建堆, 一種是使用一個空列表,然后使用heapq.heappush()函數把值加入堆中,另外一種就是使用heap.heapify(list)轉換列表成為堆結構

import heapq

# 第一種

"""

函數定義:

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))]) # 堆排序結果

# out: [1, 2, 3, 5, 23, 54, 132]

# 第二種

nums = [2, 3, 5, 1, 54, 23, 132]

heapq.heapify(nums)

print([heapq.heappop(nums) for _ in range(len(nums))]) # 堆排序結果

# out: [1, 2, 3, 5, 23, 54, 132]

heapq 模塊還有一個heapq.merge(*iterables) 方法,用于合并多個排序后的序列成一個排序后的序列, 返回排序后的值的迭代器。

類似于sorted(itertools.chain(*iterables)),但返回的是可迭代的。

"""

函數定義:

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))

訪問堆內容

堆創建好后,可以通過`heapq.heappop() 函數彈出堆中最小值。

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]

如果需要刪除堆中最小元素并加入一個元素,可以使用heapq.heaprepalce() 函數

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() 函數

"""

函數定義:

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]

"""

這兩個函數還接受一個key參數,用于dict或其他數據結構類型使用

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應用

實現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) 類似,但是它是不穩定的。

堆的值可以是元組類型,可以實現對帶權值的元素進行排序。

>>> 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')

參考

總結

以上是生活随笔為你收集整理的python标准库模块_Python标准库模块之heapq的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。