先來看一下collections模塊中的方法:python
__all__ = ['deque', 'defaultdict', 'namedtuple', 'UserDict', 'UserList', 'UserString', 'Counter', 'OrderedDict', 'ChainMap']
本章咱們只介紹除UserDict/UserList/UserString之外的方法,至於這三個方法,咱們用於繼承他們,而實現你想要的結構。
namedtuple:用於建立具備命名字段的tuple子類的工廠函數數組
#好比咱們想構造一個紙牌類 Card=namedtuple('Card',[rank,suit]) #等同於namedtuple('Card',(rank,suit)) c1=Card('A','紅桃') c2=Card('K','黑桃') print(c1.rank) #A print(c1.suit) #紅桃 print(c1.rank) #B print(c1.suit) #黑桃 #改變對象的屬性,能夠使用 對象._replace(屬性=值)方法更改已建立的對象的值 #_replace能夠傳入一個dict
deque:list-like容器,兩端都有快速追加和彈出類,用於建立多個映射的單個視圖(線程安全)安全
#其內部是一個單字母數組 a=deque("str") a.appendleft("a") #在頭部插入數據 a.append("b") #在尾部插入數據 a.count("a") #查看字符出現的次數 a.insert(2,"y") #根據索引插入值 a.clear() #清空雙端隊列
defaultdict:多值字典app
dict1=defaultdict(list/dict/set/lambda :"None") dict1['a'].add(1) #以set爲例 print(dict1) #defaultdict(<class 'set'>, {'a': {1}}) print(dict1['b']) #None,這就是lambda的做用
OrderedDict:保持元素被插入的順序,結構是一個雙向鏈表函數
#python3下dict默認也是有序的,可是方法有限 od=OrderedDict([("name","jim"),("age",19),("sex","男")]) od.setdefault("high",178) #添加一組數據,或者使用od["high"]=178 od.move_to_end('name') #將name組放置末尾 for i in od.items(): print(i) #('name', 'jim') #('age', 19) #('sex', '男') #('high', 178)
Counter:計數器,在底層中爲一個字典ui
c=Counter() #能夠直接Counter("測shishiyong"),這樣就不用循環 for i in "測shishiyong": c[i]=c[i]+1 print(c) #Counter({'s': 2, 'h': 2, 'i': 2, '測': 1, 'y': 1, 'o': 1, 'n': 1, 'g': 1}) print(c.most_common(3)) #出現次數最多的三個元素 #[('s', 2), ('h', 2), ('i', 2)] #c['元素'] 查看元素的出現次數 #c.update(list/str) 能夠增長元素 #Counter能夠使用+/-進行運算
ChainMap:合併多個字典線程
dict1={'name':'jim','age':21} dict2={'high':175,'gender':'男'} new_dict=ChainMap(dict1,dict2) print(new_dict) #ChainMap({'name': 'jim', 'age': 21}, {'high': 175, 'gender': '男'}) #前dict中存在的鍵值對將會使後面dict中的鍵值對不會被從新合併,也能夠使用update()方法對 #原字典更新新字典到裏面,不過和直接合並的區別是,update會從新建立新字典,原字典更新刪除 #數據不會影響新字典