包含的主要功能如下
查看collections 的源码我们可以看到其为我们封装了以下的数据结果供我们调用
__all__ = ['deque', 'defaultdict', 'namedtuple', 'UserDict', 'UserList',
'UserString', 'Counter', 'OrderedDict', 'ChainMap']
tuple 功能详解
测试代码如下
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)
输出结果如下
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)
测试结果如下
namedtuple中的_make()和 _asdict() 方法
查看nametuple的源码我们可以看到其封装了以下的方法
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)
输出结果如下