1. 程式人生 > >在學習中對deque/defaultdict/orderedict的一點總結

在學習中對deque/defaultdict/orderedict的一點總結

關於deque的使用

collections.deque([list[, max_length]])

# 不限定長度,可隨意新增沒有上限
>>> from collections import deque
>>> q = deque()
>>> q.append(1)
>>> q
deque([1])

 

# 定義限定的list長度,當list中的值超過限定的長度之後,會從新增端的另一側刪除引數超出部分

# 使用append()從右側新增資料,如果新增資料滿了,會從左側刪除超出部分的資料
>>> q = deque([], 5) # 新增到[]中,限定長度為5
>>> q.append(1)
>>> q.append(2)
>>> q.append(3)
>>> q.append(4)
>>> q.append(5)
>>> q
deque([1, 2, 3, 4, 5], maxlen=5)
>>> q.append(6)
>>> q
deque([2, 3, 4, 5, 6], maxlen=5)

 

# 使用appendleft()從左側新增資料,如果資料溢位,那麼從右側刪除資料
>>> q
deque([2, 3, 4, 5, 6], maxlen=5)
>>> q.appendleft(10)
>>> q
deque([10, 2, 3, 4, 5], maxlen=5)

 

# 使用pop()從右側彈出一個元素
>>> q
deque([10, 2, 3, 4, 5], maxlen=5)
>>> q.pop()
5

# 使用popleft()從左側彈出一個元素
>>> q
deque([10, 2, 3, 4], maxlen=5)
>>> q.popleft()
10

 

# 使用reverse()進行所有元素的翻轉
>>> q
deque([2, 3, 4], maxlen=5)
>>> q.reverse()
>>> q
deque([4, 3, 2], maxlen=5)

 

# index(x[, start[, end]])返回元素的位置
>>> q
deque([4, 3, 2], maxlen=5)
>>> q.index(3)
1

 

# count(x)計算數量
>>> q
deque([1, 5, 3, 2, 2], maxlen=5)
>>> q.count(2) # 計算等於2的個數
2

 

# clear()進行清空list
>>> q
deque([1, 5, 3, 2, 2], maxlen=5)
>>> q.clear()
>>> q
deque([], maxlen=5)


# 使用copy()函式進行復制
>>> q
deque([7, 3, 6, 1, 43, 6], maxlen=6)
>>> list2 = q.copy()
>>> list2
deque([7, 3, 6, 1, 43, 6], maxlen=6)


# extend()批量新增元素(非單個新增),預設右側
>>> q
deque([7, 3, 6, 1, 43, 6], maxlen=6)
>>> list3 = [1,2,4]
>>> q.extend(list3)
>>> q
deque([1, 43, 6, 1, 2, 4], maxlen=6)


# extendleft()左側批量新增(值得注意的是,新增的結果是按照批量新增的那個list順序的反順序,原因是對於[1,6,4]每個元素先新增1,再新增6,再新增4,而每個新增的元素都是放在最左邊)
>>> q
deque([1, 43, 6, 1, 2, 4], maxlen=6)
>>> q.extendleft([1,6,4]) # 新增[1,6,4]結果新增進去是[4,6,1]
>>> q
deque([4, 6, 1, 1, 43, 6], maxlen=6)

 

# 使用remove()進行刪除元素
>>> q
deque([4, 6, 1, 1, 43, 6], maxlen=6)
>>> q.remove(43)
>>> q
deque([4, 6, 1, 1, 6], maxlen=6)


# 使用rotate()進行旋轉list,預設旋轉1。這個旋轉呢,可以這樣理解將list整體往右移動,超出部分直接移動到最左邊
>>> q
deque([6, 4, 6, 1, 1], maxlen=6)
>>> q.rotate(2)
>>> q
deque([1, 1, 6, 4, 6], maxlen=6)


關於defaultdict()快捷簡便構造多維list

>>> s
[('a', '1'), ('b', '2'), ('c', '3'), ('a', '4'), ('b', '5'), ('a', '6')]
>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> for key, value in s:
... d[key].append(value)
...
>>> d
defaultdict(<class 'list'>, {'a': ['1', '4', '6'], 'b': ['2', '5'], 'c': ['3']})

# 不使用defaultdict
>>> s
[('a', '1'), ('b', '2'), ('c', '3'), ('a', '4'), ('b', '5'), ('a', '6')]
>>> d = {}
>>> for key, value in s:
... if key not in d:
... d[key] = []
... d[key].append(value)
...
>>> d
{'a': ['1', '4', '6'], 'b': ['2', '5'], 'c': ['3']}


# 使用OrderedDict()設定有序字典

# 設定字典
>>> from collections import OrderedDict
>>> d = OrderedDict()
>>> d['a'] = 1
>>> d['b'] = 2
>>> d['c'] = 3

# popitem([last=True]) 刪除最右邊的那個鍵值對,如果last=False,那麼刪除最左邊
>>> d.popitem()
('c', 3)
>>> d
OrderedDict([('a', 1), ('b', 2)])

 

# move_to_end(x[ ,last=True]) # 將鍵為x的鍵值對移動到末尾,如果last=False,那麼移動到最前面
>>> d
OrderedDict([('a', 1), ('b', 2)])
>>> d.move_to_end('a')
>>> d
OrderedDict([('b', 2), ('a', 1)])