介紹
大家都知道利用 .append 和 .pop 方法,我們可以把清單當作棧或者隊列來用(比如,把 append 和 pop(0) 合起來用,就能模拟棧的“先進先出”的特點)。但是删除清單的第一個元素(抑或是在第一個元素之前添加一個 元素)之類的操作是很耗時的,因為這些操作會牽扯到移動清單裡的所有元素。這個時候雙向隊列就又作用了。
deque 是什麼
collections.deque 類(雙向隊列)是一個線程安全、可以快速從兩端添加或者删除元素的資料類型。而且如果想要有一種資料類型來存 放“最近用到的幾個元素”,deque 也是一個很好的選擇。這是因為在建立一個雙向隊列的時候,你可以指定這個隊列的大小,如果這個隊列滿員了,還可以從反向端删除過期的元素,然後在尾端添加新的元素。
下面用幾個執行個體來說明如何使用雙向隊列以及帶來了什麼友善的處理方式。
一開始我們需要先初始化一個固定長度的雙向隊列便于我們實驗。
說明:maxlen 是一個可選參數,代表這個隊列可以容納的元素的數量,不可變。
from collections import deque
#雙向隊列
listdq=deque(range(10),maxlen=10)
print (listdq)
1.正向旋轉(循環)
說明:隊列的旋轉操作接受一個參數 n,當 n > 0 時,隊列的最右邊的 n 個元素會被移動到隊列的左邊。當 n < 0 時,最左邊的 n 個元素會被 移動到右邊。
#正向旋轉
listdq.rotate(2)
print(listdq)
2.反向旋轉(逆時針)
#反向旋轉
listdq.rotate(-2)
print(listdq)
3.附加資料
說明:當試圖對一個已滿(len(d) == d.maxlen)的隊列做尾部添加操作的時候,它頭部的元素會被删除掉。注意在下一行裡,元素 0 被删除 了。
#附加資料
listdq.appendleft(-1)
print(listdq)
listdq.append(10)
print(listdq)
4.擴充資料
說明:extendleft(iter) 方法會把疊代器裡的元素逐個添加到雙向隊列的左邊,是以疊代器裡的元素會逆序出現在隊列裡。注意是逆序。
#擴充資料
listdq.extendleft([20,30,40])
print(listdq)
listdq.extend([50])
print(listdq)
以上代碼結果如下:
雙向清單和隊列的方法介紹:
總結:
本篇總結了清單和雙向隊列這兩個類型的方法(object 類包含的方 法除外)。
雙向隊列實作了大部分清單所擁有的方法,也有一些額外的符合自身設 計的方法,比如說 popleft 和 rotate。但是為了實作這些方法,雙向 隊列也付出了一些代價,從隊列中間删除元素的操作會慢一些,因為它 隻對在頭尾的操作進行了優化。
append 和 popleft 都是原子操作,也就說是 deque 可以在多線程程式 中安全地當作先進先出的棧使用,而使用者不需要擔心資源鎖的問題。