最新公告
  • 欢迎您光临码农资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!加入我们
  • python中collections库详解

    collections 是 Python 内建的一个容器模块,提供了许多有用的容器类或生成容器类的函数,这些类和函数丰富了我们在项目开发过程中常用的数据结构。

    这些数据结构大都是 Python 自带容器(list,tuple,set,dict)的子类,我们按项目需求可以作为 Python
    自带容器的替代选择。

    namedtuple

    我们知道 tuple 可以表示不变集合,比如我们用 tuple 来表示一个平面上的点的坐标。

    point = (1, 2)
    print(point)

    我们在进行项目开发中,程序编写的可读性是很重要的一方面,直接用元组的形式初始化一个变量可读性并不是那么好,我们可以用类来封装一个点的坐标。

    class Point(object):
        def __init__(self, px, py):
            if isinstance(px, (int, float)) and isinstance(py, (int, float)):
                self.px = px
                self.py = py
            else:
                raise ValueError("请输入整数或浮点数类型数据")
    
    point = Point(1, 2)
    print(point.px)
    print(point.py)

    我们用类来实现点坐标有点小题大做,Python
    语言的高级特性,给我们提供了 namedtuple 函数,它用来创建一个自定义的 tuple
    类,该类是一个有序集合。

    from collections import namedtuple
    
    Point = namedtuple("Point", ['px', 'py'])
    
    point = Point(1, 2)
    print(point.px, point.py)  # 可以通过对象直接访问属性

    namedtuple 函数返回的是我们定制的 tuple
    的子类,我们可以通过对象加入属性来访问里面的值。

    from collections import namedtuple
    
    Point = namedtuple("Point", ['px', 'py'])
    
    point = Point(1, 2)
    print(point.px, point.py)        # 可以通过对象直接访问属性
    print(isinstance(point, tuple))  # Point 类是 tuple 类的子类

    deque

    我们使用 list 存储数据时,按索引访问元素很快,如果数据比较大,我们插入和删除元素就会很慢,因为
    list 需要重新动态分配内存进行构建整个 list,deque 是为了高效实现插入和删除操作的双向列表,适合用于队列和栈。

    deque 除了实现 list 的 append 函数和 pop 函数外,还支持 appendleft 函数和 popleft
    函数,这样就可以非常高效地往头部添加或删除元素。

    from collections import deque
    
    myq = deque(['p', 'y', 't', 'h', 'o', 'n'])
    myq.appendleft('b')
    myq.append('d')
    print(myq)
    myq.pop()
    print(myq)
    myq.popleft()
    print(myq)

    defaultdict

    我们在使用 dict 时,如果引用的 Key 不存在,就会抛出 KeyError。如果希望 key
    不存在时,返回一个默认值,我们可以用 defaultdict。

    defaultdict 是 dict 的子类,defaultdict 的构造函数默认参数是 None,如果我们使用默认参数
    None,则和 dict 具有一样的用法,比如访问的 key 不存在时,则抛出异常;也可以使用 get
    函数,如果引用的 key 不存在时,则返回 None 或给出的默认值。

    from collections import defaultdict
    
    def func():
        return "键不存在"
    
    mydftdict = defaultdict()
    print(isinstance(mydftdict, dict))  # True,defaultdict 是 dict 的子类
    mydftdict['name'] = "老鸟python"
    print(mydftdict.get("ruhua"))       # 返回 None
    print(mydftdict['ruhua'])           # 抛出异常

    我们的 defaultdict 也可以使用接收一个函数作为构造函数的参数,如果引用的 key
    不存在时,则返回的是参数函数的调用。

    from collections import defaultdict
    
    def func():
        return "键不存在"
    
    mydftdict = defaultdict(func)
    mydftdict['name'] = "python"
    print(mydftdict['ruhua'])  # 调用 func 函数

    OrderedDict

    使用 dict 时,Key 并不是按照我们定义时的顺序存储的,因此在对 dict 做迭代时,我们无法确定 Key
    的顺序,如果想要保持 Key 的顺序,我们可以用 OrderedDict。

    from collections import OrderedDict
    
    mydict = dict()  # Python 解释器的 dict,等价于 mydict = {}
    myorddict = OrderedDict()
    mydict['a'] = 1
    mydict['b'] = 2
    mydict['c'] = 3
    myorddict['a'] = 1
    myorddict['b'] = 2
    myorddict['c'] = 3
    
    for item in mydict:
        print(item)         # a,c,b(注意:该结果只能用 python3.6 之前的版本或者 python2 版本)
    
    for item in myorddict:  # a,b,c
        print(item)

    OrderedDict 构造函数的参数可以为空,或者 dict,或者配对的 tuple 和 list 等,这和
    Python 内置的 dict 的构造函数接收的参数一样。下面我们分别用各种参数形式创建 Python 解释器的 dict 类对象和
    Python 内建模块中的 OrderedDict 类的对象,并打印出 dict 对象 和 OrderedDict 对象中的内存中的数据。

    from collections import OrderedDict
    
    mydict = dict()  # Python 自带的 dict,等价于 mydict = {}
    print(mydict)
    mydict = dict({"a": 1, "b": 2, "c": 3})  # 等价于 mydict = {"a": 1, "b": 2, "c": 3}
    print(mydict)
    mydict = dict((("a", 1), ("b", 2), ("c", 3)))
    print(mydict)
    mydict = dict((["a", 1], ["b", 2], ["c", 3]))
    print(mydict)
    mydict = dict([["a", 1], ["b", 2], ["c", 3]])
    print(mydict)
    mydict = dict([("a", 1), ("b", 2), ("c", 3)])
    print(mydict)
    
    myorddict = OrderedDict()
    print(myorddict)
    myorddict = OrderedDict({"a": 1, "b": 2, "c": 3})
    print(myorddict)
    myorddict = OrderedDict((("a", 1), ("b", 2), ("c", 3)))
    print(myorddict)
    myorddict = OrderedDict((["a", 1], ["b", 2], ["c", 3]))
    print(myorddict)
    myorddict = OrderedDict([["a", 1], ["b", 2], ["c", 3]])
    print(myorddict)
    myorddict = OrderedDict([("a", 1), ("b", 2), ("c", 3)])
    print(myorddict)

    用 dict 初始化 OrderedDict 时,顺序还是按照 dict 的内部结构存储的,因为 Python 在构建 dict
    时就已经按哈希算法改变了内存的顺序,我们用的只是构建好后的 dict 对象初始化我们的 OrderedDict 对象。

    from collections import OrderedDict
    
    myorddict = OrderedDict()
    
    '''
    1.Python 解释器只要碰到 {...} 符号,都会调用 dict(...) 来转换。
    2.所以对于 {"a": 1, "b": 2, "c": 3},Python 解释器转换为 dict({"a": 1, "b": 2, "c": 3})。
    3.而 dict({"a": 1, "b": 2, "c": 3}) 在内存中已经按哈希改变了存储顺序。
    '''
    myorddict = OrderedDict({"a": 1, "b": 2, "c": 3})
    print(myorddict)

    注意,Python3.6 之后版本的 dict 显示方式都是按照构建时候的顺序了,也就是说,用了 3.6
    之后的版本,dict 和 OrderedDict 没什么区别了。

    Counter

    Counter 是一个简单的计数器类,它继承 dict 类,如果我们通过 Counter
    对象访问的键不存在时,并不会抛出异常,而是返回 0,
    我们可以用它统计可迭代的集合的元素个数。

    from collections import Counter
    
    str = "hellopython"
    ct = Counter()
    print(isinstance(ct, dict))  # True
    
    for item in str:
        ct[item] = ct[item] + 1  # 对于 ct[item],如果 item 不存在,默认为 0
    
    print(ct)

    当然我们可以用 Counter 统计 Python 自带的任何集合(str,list,tuple,dict,set)中成员出现的个数,集合中的成员可以是任意类型,下面我们以列表为例。

    from collections import Counter
    
    mylist = ["ruhua", 3, "xx", 3, 2, "ruhua"]
    ct = Counter()
    
    for item in mylist:
        ct[item] = ct[item] + 1  # 对于 ct[item],如果 item 不存在,默认为 0
    
    print(ct)

    本节重要知识点

    会用 collections 模块的各种函数和类。

    清楚 collections 模块里的各种函数或类返回的数据类型。

    想要了解更多内容,请持续关注码农资源网,一起探索发现编程世界的无限可能!
    本站部分资源来源于网络,仅限用于学习和研究目的,请勿用于其他用途。
    如有侵权请发送邮件至1943759704@qq.com删除

    码农资源网 » python中collections库详解
    • 7会员总数(位)
    • 25846资源总数(个)
    • 0本周发布(个)
    • 0 今日发布(个)
    • 293稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情