python中的deque基本用法詳解
摘要
deque(雙端隊(duì)列)是Python標(biāo)準(zhǔn)庫collections模塊中的一個(gè)類,它支持從兩端快速添加和刪除元素。deque為固定大小或者可變大小的隊(duì)列提供了線程安全的實(shí)現(xiàn),并且它比使用列表(list)來實(shí)現(xiàn)相同的功能更為高效
deque的主要特點(diǎn)和操作包括:
- 快速從兩端添加和刪除元素:
deque在兩端添加和刪除元素的時(shí)間復(fù)雜度都是O(1),而列表在列表頭部添加或刪除元素的時(shí)間復(fù)雜度是O(n)。 - 線程安全:
deque的實(shí)例可以在多線程環(huán)境中安全使用,而不需要額外的鎖定。 - 可選的最大長度:可以通過
maxlen參數(shù)來限制deque的最大長度。當(dāng)deque已滿時(shí),添加新元素會(huì)導(dǎo)致最早添加的元素被自動(dòng)移除。
下面是deque的一些詳細(xì)示例:
示例1:基本使用
from collections import deque
# 創(chuàng)建一個(gè)空的deque
d = deque()
# 從右側(cè)添加元素
d.append('a')
d.append('b')
print(d) # 輸出:deque(['a', 'b'])
# 從左側(cè)添加元素
d.appendleft('c')
print(d) # 輸出:deque(['c', 'a', 'b'])
# 從右側(cè)移除元素
right_item = d.pop()
print(right_item) # 輸出:'b'
print(d) # 輸出:deque(['c', 'a'])
# 從左側(cè)移除元素
left_item = d.popleft()
print(left_item) # 輸出:'c'
print(d) # 輸出:deque(['a'])
示例2:使用maxlen限制隊(duì)列長度
from collections import deque
# 創(chuàng)建一個(gè)最大長度為3的deque
d = deque(maxlen=3)
# 添加元素
d.append('a')
d.append('b')
d.append('c')
print(d) # 輸出:deque(['a', 'b', 'c'], maxlen=3)
# 繼續(xù)添加元素,最早添加的元素'a'將被移除
d.append('d')
print(d) # 輸出:deque(['b', 'c', 'd'], maxlen=3)
# 嘗試從左側(cè)添加元素,同樣會(huì)移除最早添加的元素
d.appendleft('e')
print(d) # 輸出:deque(['e', 'c', 'd'], maxlen=3)
示例3:使用deque實(shí)現(xiàn)滑動(dòng)窗口算法
滑動(dòng)窗口算法常用于數(shù)組或列表的子序列問題,如尋找最大/最小子序列和。
from collections import deque
def max_sliding_window(nums, k):
# 使用deque保存窗口中的最大值索引
window = deque()
result = []
for i in range(len(nums)):
# 如果deque不為空且當(dāng)前元素大于deque尾部元素對應(yīng)的值,則移除尾部元素
while window and nums[window[-1]] <= nums[i]:
window.pop()
# 添加當(dāng)前元素的索引到deque
window.append(i)
# 當(dāng)窗口大小達(dá)到k時(shí),開始記錄窗口內(nèi)的最大值,并嘗試移動(dòng)窗口左邊界
if i >= k - 1:
result.append(nums[window[0]]) # window[0]是當(dāng)前窗口內(nèi)最大值的索引
# 如果deque頭部的索引已經(jīng)不在當(dāng)前窗口內(nèi),則移除頭部索引
if window[0] <= i - k:
window.popleft()
return result
nums = [1, 3, -1, -3, 5, 3, 6, 7]
k = 3
print(max_sliding_window(nums, k)) # 輸出:[3, 3, 5, 5, 6, 7]
在這個(gè)例子中,deque用于存儲(chǔ)當(dāng)前窗口內(nèi)元素值的索引,通過維護(hù)一個(gè)遞減的索引隊(duì)列,我們可以快速找到窗口內(nèi)的最大值。當(dāng)窗口向右滑動(dòng)時(shí),我們更新隊(duì)列并記錄每個(gè)窗口的最大值。
在Python中,collections.deque 是一個(gè)非常實(shí)用的雙向隊(duì)列實(shí)現(xiàn),它可以高效地在隊(duì)列兩端添加或移除元素。以下是一些使用 deque 的示例:
示例 4: 使用 deque 實(shí)現(xiàn)旋轉(zhuǎn)數(shù)組
from collections import deque
def rotate_array(nums, k):
dq = deque(nums)
dq.rotate(-k) # 逆時(shí)針旋轉(zhuǎn) k 位,如果是順時(shí)針旋轉(zhuǎn)則直接寫 k
return list(dq)
nums = [1, 2, 3, 4, 5, 6, 7]
k = 3
rotated_nums = rotate_array(nums, k)
print(rotated_nums) # 輸出: [5, 6, 7, 1, 2, 3, 4]
示例 5: 使用 deque 實(shí)現(xiàn)最大/最小棧
from collections import deque
class MaxStack:
def __init__(self):
self.stack = deque()
self.max_stack = deque()
def push(self, x):
self.stack.append(x)
if not self.max_stack or x >= self.max_stack[-1]:
self.max_stack.append(x)
def pop(self):
if self.stack:
if self.stack[-1] == self.max_stack[-1]:
self.max_stack.pop()
return self.stack.pop()
return None
def top(self):
return self.stack[-1] if self.stack else None
def getMax(self):
return self.max_stack[-1] if self.max_stack else None
# 使用示例
max_stack = MaxStack()
max_stack.push(5)
max_stack.push(7)
max_stack.push(1)
max_stack.push(5)
print(max_stack.getMax()) # 輸出: 7
max_stack.pop()
print(max_stack.top()) # 輸出: 5
print(max_stack.getMax()) # 輸出: 7
在這個(gè)例子中,MaxStack 類使用兩個(gè) deque:一個(gè)用于存儲(chǔ)棧的元素,另一個(gè)用于存儲(chǔ)當(dāng)前棧中的最大值。這樣,我們可以在常數(shù)時(shí)間內(nèi)獲取棧頂?shù)淖畲笾?/p>
示例 6: 使用 deque 實(shí)現(xiàn)廣度優(yōu)先搜索(BFS)
在圖的遍歷中,deque 常用于實(shí)現(xiàn)廣度優(yōu)先搜索(BFS)。
from collections import deque
def bfs(graph, root):
visited = set()
queue = deque([root])
while queue:
vertex = queue.popleft()
print(vertex, end=" ")
for neighbour in graph[vertex]:
if neighbour not in visited:
visited.add(neighbour)
queue.append(neighbour)
# 圖的鄰接表表示
graph = {
'A': ['B', 'C'],
'B': ['D', 'E'],
'C': ['F'],
'D': [],
'E': ['F'],
'F': []
}
bfs(graph, 'A') # 輸出: A B C D E F
在上面的例子中,我們使用 deque 作為隊(duì)列來存儲(chǔ)待訪問的節(jié)點(diǎn),實(shí)現(xiàn)了圖的廣度優(yōu)先搜索。
這些示例展示了 deque 在不同場景下的應(yīng)用,從基本的隊(duì)列操作到更復(fù)雜的算法實(shí)現(xiàn)。deque 的靈活性和高效性使得它成為處理序列數(shù)據(jù)的強(qiáng)大工具。
總結(jié)
到此這篇關(guān)于python中的deque基本用法的文章就介紹到這了,更多相關(guān)python中deque用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Qt5 實(shí)現(xiàn)主窗口狀態(tài)欄顯示時(shí)間
這篇文章主要介紹了Qt5 實(shí)現(xiàn)主窗口狀態(tài)欄顯示時(shí)間,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03
使用基于Python的Tornado框架的HTTP客戶端的教程
這篇文章主要介紹了制作一個(gè)基于Python的Tornado框架的HTTP客戶端的教程,Tornado的異步特性使其能夠獲得很好的性能,需要的朋友可以參考下2015-04-04
詳解使用python繪制混淆矩陣(confusion_matrix)
這篇文章主要介紹了詳解使用python繪制混淆矩陣(confusion_matrix),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
利用python+request通過接口實(shí)現(xiàn)人員通行記錄上傳功能
這篇文章主要介紹了利用python+request通過接口實(shí)現(xiàn)人員通行記錄上傳功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
詳解Python函數(shù)可變參數(shù)定義及其參數(shù)傳遞方式
這篇文章主要介紹了詳解Python函數(shù)可變參數(shù)定義及其參數(shù)傳遞方式的相關(guān)資料,這里提供實(shí)例代碼幫助大家學(xué)習(xí)理解這部分內(nèi)容,需要的朋友可以參考下2017-08-08

