1. 程式人生 > >Python collections 模組學習總結

Python collections 模組學習總結

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