python 必學模塊collections

包含的主要功能以下前端

查看collections 的源碼咱們能夠看到其爲咱們封裝瞭如下的數據結果供咱們調用python

__all__ = ['deque', 'defaultdict', 'namedtuple', 'UserDict', 'UserList',
            'UserString', 'Counter', 'OrderedDict', 'ChainMap']

tuple 功能詳解

測試代碼以下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功能詳解

 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)  

 

打印結果以下

 

defaultdict使用詳解

對應傳統的統計列表中的元素數量,咱們的作法廣泛以下 

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功能詳解

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)

 

Counter詳解

 能夠幫助咱們統計數量和返回最大的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))

打印結果以下

 

OrderDict功能詳解

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)

打印結果以下

Chainmap詳解 

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)

  

輸出結果以下

相關文章
相關標籤/搜索