python 必学模块collections

包含的主要功能如下

查看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)

  

输出结果如下

 

 

 

 

转载于:https://www.cnblogs.com/crazymagic/p/10039980.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值