Python 標準庫之雙端佇列
阿新 • • 發佈:2018-12-29
寫在之前
雙端佇列(deque)同時具備棧和佇列的特徵,棧是先進後出的資料結構,佇列是先進先出的資料結構(請先知道這個概念),所以雙端佇列可以從序列的任何一端新增和刪除項。
雙端佇列(deque)
首先我們先來看一個簡單的小問題:如果有一個列表,比如 [1,2,3],讓你在最右邊增加一個數字。看到這你肯定要說,這也太簡單了,不就是 append() 一下嘛。
這個是簡單,但能不能在最左邊增加一個數字呢?請先思考一下,思考完畢後請接著往下看:
>>> l1 = [1,2,3] >>> l1.append(4) >>> l1 [1, 2, 3, 4] >>> n = [7] >>> n.extend(l1) >>> n [7, 1, 2, 3, 4]
除了上述方法以外,或許你還有別的辦法。但是,追求簡潔優雅的 Python 早就替我們想好了,它為我們提供了一個更簡單的模組來解決這個問題。
>>> from collections import deque
用上述的這種引用方法是以為 collections 中東西很多,我們這次只用到 deque。
>>> l1 = [1,2,3,4]
這次還是用這個列表,試試分別從右邊和左邊增加數字。
>>> ql = deque(l1)
上面這個是必須的,將列表轉換成 deque 物件。deque 就是翻譯過來的雙端佇列(Double-ended Queue)。
>>> ql.append(5)
>>> ql
deque([1, 2, 3, 4, 5])
>>> ql.appendleft(7)
>>> ql
deque([7, 1, 2, 3, 4, 5])
這樣的操作可以說是相當方便了。然後下面讓我們繼續來看如何刪除:
>>> ql.pop() 5 >>> ql deque([7, 1, 2, 3, 4]) >>> ql.popleft() 7 >>> ql deque([1, 2, 3, 4])
函式 popleft() 是去掉最左邊的項並返回該項,pop() 是去掉最右邊的項並返回該項。接下來我們來做一個小題,加深一下印象:判斷一下一個詞是不是迴文。判斷迴文的話我們都知道,最簡單的就是從一個詞的兩端向中間掃描,只要兩端的字元匹配,一直彈出直到到達中間:
from collections import deque
def palindrome(word):
dq = deque(word)
while len(dq) > 1:
if dq.popleft() != dq.pop():
return False
return True
程式碼基本上就是像上面寫的那樣,接下來讓我們來測試一下:
print(palindrome('a'))
print(palindrome('rocky'))
print(palindrome(''))
print(palindrome('radar'))
執行的結果如下所示:
True
False
True
True
寫在之後
更多內容,歡迎關注公眾號「Python空間」,期待和你的交流。