在內置函數(dict、list、set、tuple)的基礎上,collections模塊還提供了幾個其他的數據類型:Counter、deque、defaultdict、namedtuple和OrdereDict等 1.namedtuple 作用:用於生成一個可以使用名字訪問元素內容的tuple 如果 ...
在內置函數(dict、list、set、tuple)的基礎上,collections模塊還提供了幾個其他的數據類型:Counter、deque、defaultdict、namedtuple和OrdereDict等
1.namedtuple
作用:用於生成一個可以使用名字訪問元素內容的tuple
如果要表示一個點,我們可以這樣表示,但是在使用時我們很難看出這個tuple是用來表示一個坐標
p = (1,2)
因此我們調用namedtuple來解決這個問題
表示二維中的一個點:
import collections Point = collections.namedtuple('Point',['x','y']) print(Point) #<class '__main__.Point'> p = Point(1,2) print(p.x) #1 print(p.y) #2 print(p) #Point(x=1, y=2)
表示三維中的一個點:
import collections Point = collections.namedtuple('Point',['x','y','z']) print(Point) #<class '__main__.Point'> p = Point(1,2,3) print(p.x) #1 print(p.y) #2 print(p.z) #3 print(p) #Point(x=1, y=2, z=3)
表示一個圓的屬性:
import collections Circle = collections.namedtuple('Circle',['r','d','s','l'])
表示一張撲克牌:
import collections Card = collections.namedtuple('card',['c_class','c_num']) c = Card('方塊','4') print(c.c_class) #方塊 print(c.c_num) #4 print(c) #card(c_class='方塊', c_num='4')
2.deque()
這裡先說一個隊列quque()
隊列的特性:先進先出(FIFO)
import queue i = 1 q = queue.Queue() q.put(5) q.put(6) q.put(-5) print(q) #<queue.Queue object at 0x0000000002082EB8> print(q.qsize()) #3 整個隊列長度為3 print(q.get()) #5 print(q.get()) #6 print(q.get()) #-5 print(q.get()) #阻塞 因為整個隊列只有3個元素,當3個元素全部取出後就再也取不出新的元素,程式就會一直等待用戶給它一個值
deque()雙端隊列,兩邊的頭都可以取和存
from collections import deque dq = deque([5,6]) dq.append('a') #從後面放數據 dq.appendleft('b') #從前面放數據 dq.insert(1,'c') #在1這個索引下加入'c',原位置下的元素往後移一位 print(dq) #deque(['b', 'c', 5, 6, 'a']) print(dq.pop()) #a 向後彈出一個元素'a' print(dq.popleft()) #b 向前彈出一個元素'b'
運用隊列的好處在於能夠高效插入和刪除操作的雙向列表,適合用於隊列和棧
而我們使用list,雖然訪問元素速度很快但是我們要插入或刪除一個元素就會慢很多,數據量大的時候後,插入和刪除效率也會很低
3.OrderedDict()
當我們在操作字典時,我們無法確定自己的key的順序,如果我們要保持這一順序我們就可以使用有序字典OrderedDict()這一個方法
from collections import OrderedDict od = OrderedDict([('k1',1),('k2',2),('k3',3)]) print(od) #OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)]) print(od['k1']) #1 for k in od: print(k) #k1 #k2 #k3
ps:存儲一個列表或字典時,字典往往會比列表更占記憶體
4.defaultdict()
給字典通過一個沒有參數的匿名函數設置一個預設值
from collections import defaultdict d = defaultdict(lambda : 5) print(d['k']) #5 print(d['v']) #5 print(d['b']) #5 print(d) #defaultdict(<function <lambda> at 0x0000000002158730>, {'k': 5, 'v': 5, 'b': 5})
5.Counter()
功能主要是跟蹤值出現的次數,它是一個無序的容器,以鍵值對的形式儲存,其中元素為key,其計數作為value,計數值可以是任意的int(包括負數和0),Counter類和其他語言的bags或multisets很相似
from collections import Counter ret = Counter('avbb223') print(ret) #Counter({'b': 2, '2': 2, 'a': 1, 'v': 1, '3': 1})