包含的主要功能以下前端
查看collections 的源碼咱們能夠看到其爲咱們封裝瞭如下的數據結果供咱們調用python
__all__ = ['deque', 'defaultdict', 'namedtuple', 'UserDict', 'UserList', 'UserString', 'Counter', 'OrderedDict', 'ChainMap']
測試代碼以下mysql
name_tuple = ('zhangbiao',18,['beijing']) name, *other = name_tuple # 拆包 print(name,other) # tuple 不可變不是絕對的 name_tuple[2].append('haha') print(name_tuple) # 能夠做爲字典的key user_tuple = ('zhangbiao',18,175) dict = {} dict[user_tuple] = 'zhangbiao' print(dict)
輸出結果以下sql
namedtuple適用於建立一個簡單的對象數據庫
from collections import namedtuple User = namedtuple('user',['name','age','height']) user_tuple = ('zhangbiao', 29, 175) user = User(*user_tuple) print(user.age, user.name, user.height)
打印結果以下數組
使用namedtuple的好處,好比咱們經過查詢數據庫(MySQLClient和pymysql)返回給咱們的就是一個元祖,咱們想要給前端返回的數據是name,age,height 和edu ,而咱們的數據庫中沒有edu這個字段,這時候咱們就能夠利用namedtuple很輕鬆的處理這種狀況安全
from collections import namedtuple User = namedtuple('user',['name','age','height','edu']) # 假如是數據庫中查詢出來的數據 user_tuple = ('zhangbiao', 29, 175) # 添加edu的字段 user = User(*user_tuple ,edu='master') print(user.age, user.name, user.height)
測試結果以下app
namedtuple中的_make()和 _asdict() 方法測試
查看nametuple的源碼咱們能夠看到其封裝瞭如下的方法spa
class {typename}(tuple): '{typename}({arg_list})' __slots__ = () _fields = {field_names!r} def __new__(_cls, {arg_list}): 'Create new instance of {typename}({arg_list})' return _tuple.__new__(_cls, ({arg_list})) @classmethod def _make(cls, iterable, new=tuple.__new__, len=len): 'Make a new {typename} object from a sequence or iterable' result = new(cls, iterable) if len(result) != {num_fields:d}: raise TypeError('Expected {num_fields:d} arguments, got %d' % len(result)) return result def _replace(_self, **kwds): 'Return a new {typename} object replacing specified fields with new values' result = _self._make(map(kwds.pop, {field_names!r}, _self)) if kwds: raise ValueError('Got unexpected field names: %r' % list(kwds)) return result def __repr__(self): 'Return a nicely formatted representation string' return self.__class__.__name__ + '({repr_fmt})' % self def _asdict(self): 'Return a new OrderedDict which maps field names to their values.' return OrderedDict(zip(self._fields, self)) def __getnewargs__(self): 'Return self as a plain tuple. Used by copy and pickle.' return tuple(self) {field_defs} """
這裏面最經常使用的的是_make 和 _asdict 方法
_make方法的使用是在咱們建立 namedtuple的時候能夠傳入一個可迭代的對象
from collections import namedtuple User = namedtuple('user',['name','age','height']) user_tuple = ('zhangbiao', 29, 175) user_list = ['zhangbiao', 29, 175] user_dict = { "name": "zhangbiao", "age": 29, "height": 175, } user = User._make(user_dict) user1 = User._make(user_list) # 拆包 name , age, *other = user
打印結果以下
_asdict 方法就是把namedtulple轉化成一個OrderedDict
from collections import namedtuple User = namedtuple('user',['name','age','height']) user_tuple = ('zhangbiao', 29, 175) user = User._make(user_tuple) user_info_dict = user._asdict() print(user_info_dict)
打印結果以下
對應傳統的統計列表中的元素數量,咱們的作法廣泛以下
users = ['zhangbiao1', 'zhangbiao1', 'zhangbiao2', 'zhangbiao2', 'zhangbiao2','zhangbiao3'] user_count = {} for user in users: user_count.setdefault(user, 0) user_count[user] += 1 print(user_count)
defaultdict的用法
在初始化的時候傳入的是一個可調用的對象,若是在使用的時候改鍵不存在會給它默認的賦一個初始值(這個初始值和建立傳的可調用對象有關)
from collections import defaultdict default_dict = defaultdict(int) default_dict1 = defaultdict(list) default_dict['name'] default_dict1['name'] print(default_dict) print(default_dict1)
打印結果
那麼如何來指定咱們想要的默認值呢,在這裏默認想指定的值爲1
from collections import defaultdict dd = defaultdict(list) def zero(): return 1 dd = defaultdict(zero) print(dd['count'])
使用defaultdict 統計數組中的數量
from collections import defaultdict users = ['zhangbiao1', 'zhangbiao1', 'zhangbiao2', 'zhangbiao2', 'zhangbiao2','zhangbiao3'] default_dict = defaultdict(int) for user in users: default_dict[user] += 1 print(default_dict)
打印結果以下
deque 和 list 的卻別
deque是線程安全的,list不是線程安全的
從源碼中咱們能夠看到deque的方法以下
簡單使用以下
from collections import deque user_deque = deque(['zhangbiao1','zhangbiao2','zhangbiao3']) user_deque.append(1) user_deque.appendleft(2) print(user_deque)
能夠幫助咱們統計數量和返回最大的top n 的值
from collections import Counter users = ['zhangbiao1', 'zhangbiao1', 'zhangbiao2', 'zhangbiao2', 'zhangbiao2','zhangbiao3'] user_count = Counter(users) # 統計數量 print(user_count) # 獲取top n (返回最大的前兩個值) print(user_count.most_common(2))
打印結果以下
from collections import OrderedDict user_dict = OrderedDict() user_dict['a'] = 'zhangbiao1' user_dict['b'] = 'zhangbiao2' user_dict['c'] = 'zhangbiao3' # 是按照添加的順序,排的 print(user_dict) # 把 a 的值放到最後 print(user_dict.move_to_end('a')) print(user_dict)
打印結果以下
from collections import ChainMap user_dict1 = {"a": "zhangbiao1", "b": "zhangbiao2"} user_dict2 = {"b": "zhangbiao3", "d": "zhangbiao4"} # 它並非可迭代對象合併成一個 new_dict = ChainMap(user_dict1, user_dict2) print(new_dict.maps) # 能夠發現把最後出現重複的鍵給去除掉了 new_dict.maps[0]["a"] = 'bobby' for key, value in new_dict.items(): print(key, value)
輸出結果以下