python的內建模塊collections有幾個關鍵的數據結構,平常在使用的時候,開發者可以直接調用,不需要自己重覆製造輪子,這樣可以提高開發效率。 1. deque雙端隊列 平常我們使用的python內置list類的append,extend,pop方法都是從list的尾部執行的(pop()預設 ...
python的內建模塊collections有幾個關鍵的數據結構,平常在使用的時候,開發者可以直接調用,不需要自己重覆製造輪子,這樣可以提高開發效率。
1. deque雙端隊列
平常我們使用的python內置list類的append,extend,pop方法都是從list的尾部執行的(pop()預設彈出最後一個元素)。在使用的時候,list很像是一種棧結構(LIFO)。不同的是list靈活性更強,在棧的基礎上有動態插入的方法,即insert(index,obj)和索引、切片等操作。強大的list似乎也可以實現隊列(FIFO),但由於它實在太靈活了,列表中的元素極容易改變,在使用時令人總是不那麼放心。為了實現更好的隊列結構,一般程式員會自己實現一個類。
collections模塊中為我們提供的雙端隊列是在隊列的基礎上實現頭尾兩端可append、可pop。另外還有insert,rotate等方法,也是相當靈活的
關鍵方法:
append() #從右端添加元素(與list同)
appendleft() #從左端添加元素(與list同)
extend() #從右端逐個添加可迭代對象(與list同)
extendleft() #從左端逐個添加可迭代對象(與list同)
pop() #從右端彈出元素(與list同)
popleft() #從左端彈出數據
count() #統計隊列中的元素個數(與list同)
insert(index,obj) #在指定位置插入元素(與list同)
rotate() #旋轉隊列
基本使用例子:
from collections import deque d = deque() #增加數據 d.append('1') d.append('2') d.appendleft('3') l = ['4','5'] d.extend(l) d.extendleft(l) print(d) #計算deque元素個數 print(d.count('5')) #迴圈移動 d.rotate(1) print(d) d.rotate(-1) print(d)
#計算股票和倉庫存貨常用的移動平均數
from collections import deque import itertools def moving_average(iterable,n=3): it = iter(iterable) d = deque(itertools.islice(it,n-1)) #迭代出前2個數據 print(d) d.appendleft(0) #防止第一次運行演算法時候把第一個數據刪除 s = sum(d) print(d) print(s) for elem in it: s += elem-d.popleft() d.append(elem) yield s/float(n) l = [10,20,18,27,15] for average in moving_average(l): print(average)
2. defaultdict 預設字典
我們平常在使用python內置的dict的時候,根據鍵key去查詢對應的value值,如果不存在對應的key,會報錯(KeyError)。但是在defaultdict就會會出現這個問題。
例子:
dd = defaultdict(lambda:"none") #只需要在定義的時候為不存在的key定義指定的顯示值 dd["a"] = "apple" dd["b"] = "banana" print(dd["c"]) print(dd) 結果: >>>none >>>defaultdict(<function <lambda> at 0x0000023B1C1919D8>, {'c': 'none', 'a': 'apple', 'b': 'banana'})
由第二條的結果可以看出,defaultdict將不存在的鍵專門用一個字典來存放,而存在的鍵存放在另外一個字典中。當需要查詢元素時,如果遇到沒有的鍵key,就會獲取第一字典中預先設定好的顯示值。
3. OrderDict 有序字典
在使用python內置的dict時,用print()列印出整個字典,會發現前後兩次字典的鍵值對順序是不一樣的(筆者猜測是前後兩次的hash值不一樣的緣故)。而在有序字典OderDict中,這種現象不會在發生。
例子:
od = OrderedDict() od["1"] = "one" od["2"] = "two" od["3"] = "three" od["4"] = "four" od["5"] = "five" 結果: OrderedDict([('1', 'one'), ('2', 'two'), ('3', 'three'), ('4', 'four'), ('5', 'five')])