Python collections 模組學習總結
阿新 • • 發佈:2018-11-08
collections 模組
collections是Python的一個內建集合模組,提供了許多有用的集合類。
1.deque 雙端佇列
Deque是一種可以對序列兩端元素進行新增和刪除操作的基本序列容器,是以雙向連結串列的形式實現的,向deque 兩端新增或刪除元素的開銷很小,它不需要重新分配空間。
方法 | 操作 | 平均時間複雜度 | 最壞時間複雜度 | 備註 |
append(t) | 右側新增元素t | O(1) |
O(1) |
wiki |
appendleft(t) | 左側新增元素t | O(1) | O(1) | wiki |
clear() | 清空所有元素 | O(1) | O(1) | 個人理解 |
copy() | 淺複製 | O(n) | O(n) | wiki |
count(t) | 統計佇列中t出現的次數 | O(n) | O(n) | 個人理解 |
extend(t) | 從佇列的右側插入按照列表t的索引順序,逐個插入t的元素,如擴充套件是佇列超出maxlen,則從另一端丟擲多餘元素 | O(k) | O(k) | wiki |
extendleft() | 從佇列的左側插入按照列表t的索引順序,逐個插入t的元素,(每個元素都從左側開始插入),如擴充套件是佇列超出maxlen,則從另一端丟擲多餘元素 | O(k) | O(k) | wiki |
index(t [,start [,stop]]) | 返回第一個t的索引(可指定開始、結束區間),如未找到,引發ValueError | 個人理解 | ||
insert(i, x) | 在位置i插入x,如果插入會導致有界雙端超出maxlen,則引發IndexError | O(n) | O(n) | 個人理解 |
pop() | 右側移除並返回一個元素。如果佇列為空,引發IndexError | O(1) | O(1) | wiki |
popleft() | 左側移除並返回一個元素。如果佇列為空,引發IndexError | O(1) | O(1) | wiki |
remove(t) | 從佇列中移除t,如果t不存在,引發ValueError | O(n) | O(n) | wiki |
reverse() | 原地反轉佇列,無返回 | O(n) | O(n) | 個人理解 |
rotate(t) | 向右旋轉t步(t>0),向左旋轉t步(t<0),預設t=1. | O(k) | O(k) | wiki |
maxlen | 一個雙端佇列的最大大小,如未指定,則任意長度,如果是空佇列,則為None | 只讀屬性 |
(PS:部分方法資料裡沒有時間複雜度,表中部分時間複雜度為個人看法,備註中已說明)
雙端佇列支援iteration,pickling,len(d),reversed(d),copy.copy(d),copy.deepcopy(d),成員資格測試操作,下標引用,如d[-1]
。不支援切片,索引訪問在兩端時間複雜度都是O(1),但在中間減慢到O(n),對於快速隨機訪問,請改用列表。
部分方法使用程式碼:
>>>import collections
>>>a = [1, 2, 3, 4, 5]
>>>b = collections.deque(a)
>>>b
deque([1, 2, 3, 4, 5])
>>>print(type(b))
<class 'collections.deque'>
# 新增列表
>>>c = [6, 7, 8]
>>>b.extend(c) # 原列表操作
>>>b
deque([1, 2, 3, 4, 5, 6, 7, 8])
>>>b.extendleft(c)
>>>b
deque([8, 7, 6, 1, 2, 3, 4, 5, 6, 7, 8])
# 旋轉
>>>b.rotate(3) # 原列表操作,向右轉3步
>>>b
deque([6, 7, 8, 8, 7, 6, 1, 2, 3, 4, 5])
>>>b.rotate(-4) # 左轉4步
>>>b
deque([7, 6, 1, 2, 3, 4, 5, 6, 7, 8, 8])
# 建立有界雙端佇列,最大長度為7
>>>d = collections.deque(a, maxlen=7)
>>>d
deque([1, 2, 3, 4, 5], maxlen=7)
>>>d.extend(c) # 原有5個元素,在右側新增3個元素
>>>d
deque([2, 3, 4, 5, 6, 7, 8], maxlen=7) # 左側1個元素被彈出
>>>d.appendleft(0) # 佇列左側新增一個元素
>>>d
deque([0, 2, 3, 4, 5, 6, 7], maxlen=7) # 右側1個元素被彈出
# 此時如果使用insert插入元素,會引發異常
>>>d.insert(0, 1)
Traceback (most recent call last):
File "<input>", line 1, in <module>
IndexError: deque already at its maximum size
>>>d[1:4] # 雙端佇列切片,會引發異常
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: sequence index must be integer, not 'slice'
>>>d[3] # 可以使用索引
4
(未完待續)
參考資料:1. https://wiki.python.org/moin/TimeComplexity
2. https://docs.python.org/3/library/collections.html#collections.deque