1. 程式人生 > >Python 標準庫之雙端佇列

Python 標準庫之雙端佇列

寫在之前

雙端佇列(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空間」,期待和你的交流。
在這裡插入圖片描述