Python collections模塊中的deque類是一種雙向隊列(double-ended queue,雙端隊列)。從該隊列的頭部或尾部插入或移除一個元素,時間復(fù)雜度為O(1),就是不會因數(shù)據(jù)的大小及位置等因素而變化。
而對內(nèi)置的list類型,從list尾部插入或刪除元素,時間復(fù)雜度也是O(1),但是從list頭部插入或移除元素,時間復(fù)雜度就是O(n),這與deque相比,要慢得多。
deque 可以迭代,可以使用函數(shù)len求長度,可以用 in 操作符判斷是否含有某一元素,支持通過索引獲取元素;
下面是一些deque的方法:
>>> from collections import deque
>>> d = deque('ghi')
>>> d
deque(['g', 'h', 'i'])
>>> for elem in d: # deque 可迭代
print(elem)
# 不帶 >>> 的是輸出
g
h
i
>>> d.append('j')
>>> d
deque(['g', 'h', 'i', 'j'])
>>> d.appendleft('f')
>>> d
deque(['f', 'g', 'h', 'i', 'j'])
>>> d.pop()
'j'
>>> d
deque(['f', 'g', 'h', 'i'])
>>> d.popleft()
'f'
>>> d
deque(['g', 'h', 'i'])
>>> d[0]
'g'
>>> d[-1]
'i'
>>> d.extend('jkl') # 在右端一次增加多個元素
>>> d
deque(['g', 'h', 'i', 'j', 'k', 'l'])
>>> d.extendleft('edf')
>>> d
deque(['f', 'd', 'e', 'g', 'h', 'i', 'j', 'k', 'l'])
>>> 'k' in d
True
>>> d.clear()
>>> d
deque([])
>>> list1 = ['a', 'b', 'c']
>>> d = deque(list1) # 可以把一個列表轉(zhuǎn)為deque
>>> d
deque(['a', 'b', 'c'])
>>> d.count('b') # count方法可以統(tǒng)計duque中某一元素的個數(shù)
1
>>> deque(list1, 2) # 只取后兩個元素,可以實現(xiàn)打開文件時只取后面幾行
deque(['b', 'c'], maxlen=2)
如果我們只在雙向隊列的一端取數(shù)據(jù),另一端存數(shù)據(jù),那么就實現(xiàn)了先進先出(first-in-first-out,F(xiàn)IFO)的單向隊列。
如果我們只在雙向隊列的一端存數(shù)據(jù)和取數(shù)據(jù),另一端不操作數(shù)據(jù),那么就是實現(xiàn)了棧。