3 . python Collections -- Deque Object

語法:安全

    class collections.deque([iterable[maxlen]])app

    返回從左到右初始化的新deque對象(使用append())和來自iterable(可迭代的)的數據。 若是未指定iterable(迭代),則新的deque爲空。ide


    Deques是堆棧和隊列的歸納(名稱發音爲「deck」,是「雙端隊列」的縮寫)。 性能

    Deques支持線程安全,高效的內存追加和從"雙端隊列"的彈出,而且在任一方向都具備大體相同的O(1) [注:時間複雜度]性能。測試

    儘管列表對象支持相似的操做,可是它們針對快速固定長度操做進行了優化,而且會致使pop(0)和insert(0, v)操做的O(n)內存移動成本,這些操做改變底層數據表示的大小和位置。優化


    若是未指定maxlen或爲None,則deques可能會增加到任意長度。 不然,deque被限制爲指定的最大長度。一旦有限長度的deque已滿,當添加新項目時,相應數量的項目將從相反的一端被丟棄。 有界長度deques提供相似於Unix中尾部過濾器的功能。 它們也可用於跟蹤僅涉及最近活動的事物和其餘數據池。spa


Deque對象支持如下方法:線程

    append(x)                           將x添加到雙端隊列的右側。對象

    appendleft(x)                  將x添加到雙端隊列的左側。blog

    clear()                               刪除deque中的全部元素,使其長度爲0。

    copy()                                 建立一個deque的淺表副本。3.5版本中的新功能。

    count(x)                             計算deque元素的數量等於x。3.2版本中的新功能

    extend(iterable)                 經過追加iterable參數中的元素來擴展雙端隊列的右側。

    extendleft(iterable)        經過追加iterable中的元素來擴展雙端隊列的左側。請注意,一系列左邊追加結果會顛倒迭代參數中元素的順序。

    index(x[start[stop]])       返回deque中的x的位置(在索引開始處或索引中止以前)。若是未找到,則返回第一個匹配或引起ValueError。

    insert(ix)                        將x插入位置i處的deque中。3.5版本中的新功能。若是插入會致使有界的deque超出maxlen,則會引起IndexError。

    pop()                                   從deque的右側移除並返回一個元素。 若是沒有元素存在,則引起IndexError。

    popleft()                          從deque的左側移除並返回一個元素。 若是沒有元素存在,則引起IndexError

    remove(value)                   刪除第一次出現的值。 若是找不到,則會引起ValueError。

    reverse()                         反序排列deque的元素,而後返回None。New in version 3.2.

    rotate(n=1)                     向右旋轉deque n個步。 若是n爲負數,則向左旋轉。

                                            解釋:

                                            當deque不爲空時:

                                            向右旋轉一個等同於 d.appendleft(d.pop())

                                            向左旋轉一個等同於 d.append(d.popleft())

    

    另,Deque對象還提供一個只讀屬性

        maxlen

        最大的deque的大小,若是×××限,則爲None.    [3.1版本引入]


    除上述以外,deques支持迭代、pickling、len(d)、reverse(d)、copy.copy(d)、copy.deepcopy(d),使用 in 運算符進行成員資格測試,以及下標引用,例如:d[-1]。

    索引訪問在兩端都是O(1),但在中間減慢到O(n)。

    對於快速隨機訪問,請改用列表。


    從版本3.5開始,deques開始支持__add__(), __mul__(), __imul__()。

    

    下面是例子:

image.png



deque Recipes(食譜???黑人問號臉)

本節介紹處理deques的各類方法。

有界長度的deques提供了相似於Unix中尾部過濾器的功能:

image.png

#返回文件的最後n行


另外一種使用deques的方法是經過向右追加並彈出到左邊來維護一系列新添加的元素:

image.png


    rotate()方法提供了一種實現雙端切片和刪除的方法。

    例如,del d[n]的純Python實現依賴於rotate()方法來定位要彈出的元素:

image.png

    爲了實現deque切片,使用相似的方法來應用rotate( )來將目標元素置於雙端隊列的左側。 

    使用popleft( )刪除舊條目,使用extend( )添加新條目,而後反轉旋轉。 

    經過該方法的細微變化,很容易實現Forth樣式的堆棧操做,如dup,drop,swap,over,pick,rot和roll。

相關文章
相關標籤/搜索