【Python基础篇014】第贰章模块大全之《collections模块》

简介: 【Python基础篇014】第贰章模块大全之《collections模块》

 🗣️目录

👤一、collections模块前言

👤二、namedtuple的使用方法

👤三、queue(队列)方法

👤四、deque(双端队列)方法

👤五、defaultdict 方法

👥defaultdict 方法详述

👥知识点拓展之定义字典的冷门方法

👤六、Counter方法

🗣️结语


👤一、collections模块前言

在内置数据类型(dict、list、set、tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter、deque、defaultdict、namedtuple和OrderedDict等。

    • 1.namedtuple: 生成可以使用名字来访问元素内容的tuple
    • 2.deque: 双端队列,可以快速的从另外一侧追加和推出对象
    • 3.Counter: 计数器,主要用来计数
    • 4.OrderedDict: 有序字典
    • 5.defaultdict: 带有默认值的字典
    • 6.queue:队列(先进来的先出去)

    以下就会详细讲解这几个数据类型的基础知识和使用方法

    👤二、namedtuple的使用方法

    我们知道tuple可以表示不变的列表,例如,一个点的二维坐标就可以用如下方式表示:

    a = (2,3)
    image.gif

    但是我们第一眼看到a = (2,3)会想到它是表示坐标吗?我想大多数人会看成是将一个含有2和3元素的元组赋给a这个变量吧!如何让我们第一眼看到就会知道它表示坐标呢?

    这时,namedtuple就派上了用场:

    from collections import namedtuple
    #表示二维坐标
    Point = namedtuple('point',['x','y'])
    p = Point(1,2)
    #从二维坐标中取x轴的数值
    print(p.x)
    print(p.y)
    #表示三维坐标
    Point = namedtuple('point',['x','y','z'])
    p2 = Point(1,2,3)
    #从二维坐标中取x轴的数值
    print(p2.x)
    print(p2.y)
    print(p2.z)
    输出结果:
    1
    2
    1
    2
    3
    image.gif

    创建扑克牌

    Card = namedtuple('card',['suits','number'])
    #生成一张扑克牌
    clo = Card('红桃',2)
    #打印这张扑克牌
    print(clo)
    #打印这张扑克牌的花色
    print(clo.suits)
    #打印这张扑克牌的大小
    print(clo.number)
    输出结果:
    card(suits='红桃', number=2)
    红桃
    2
    image.gif

    👤三、queue(队列)方法

    Python的Queue模块中提供了同步的、线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列PriorityQueue。这些队列都实现了锁原语,能够在多线程中直接使用。可以使用队列来实现线程间的同步。

      1. Queue.put()向队列中放值
      2. Queue.get()从队列中取值
      3. Queue.qsize() 返回队列的大小
      4. Queue.empty() 如果队列为空,返回True,反之False
      5. Queue.full()如果队列满了,返回True,反之False,Queue.full 与 maxsize 大小对应
      6. Queue.get([block[, timeout]])获取队列,timeout等待时间
      7. Queue.get_nowait() 相当于Queue.get(False),非阻塞方法
      8. Queue.put(item) 写入队列,timeout等待时间
      9. Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号。每个get()调用得到一个任务,接下来task_done()调用告诉队列该任务已经处理完毕。
      10. Queue.join() 实际上意味着等到队列为空,再执行别的操作

      栗子:

      #队列
      import queue
      #首先创建一个队列
      q = queue.Queue()
      #往q队列中依次放值
      q.put(9)
      q.put(8)
      q.put(7)
      #往队列中依次取值
      print(q.get())
      print(q.get())
      print(q.get())
      输出结果:
      9
      8
      7
      image.gif

      如果还向q执行q.get()(此时q的值已被取完)向q取值的话程序不会报错但是会发生阻塞

      image.gif

      如果不想出现阻塞,可以在取值之前用Queue.qsize() 看看队列的大小

      #队列
      import queue
      #首先创建一个队列
      q = queue.Queue()
      #往q队列中依次放值,
      # 放的值可以是任意的数据类型,但是一次只可以放一个值
      q.put([1,2,3])
      q.put(8)
      q.put(7)
      #打印这个队列
      print(q)
      #往队列中依次取值
      print(q.get())
      print(q.get())
      print('还有%d个值可取' % q.qsize())
      print(q.get())
      print('还有%d个值可取' % q.qsize())
      #print(q.get())#程序发生阻塞
      输出结果:
      <queue.Queue object at 0x0000020106C89A30>
      [1, 2, 3]
      8
      还有1个值可取
      7
      还有0个值可取
      image.gif

      👤四、deque(双端队列)方法

      双端队列(deque,全名double-ended queue),是一种具有队列和栈的性质的数据结构。

      双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。双端队列可以在队列任意一端入队和出队。

      操作:

      image.gif编辑

        1. Deque() 创建一个空的双端队列
        2. append()向双端队列后面放数据
        3. appendleft()向双端队列前面放数据
        4. pop()向双端队列后面取数据
        5. popleft()向双端队列前面取数据
        6. add_front(item) 从队头加入一个item元素
        7. add_rear(item)从队尾加入一个item元素
        8. remove_front() 从队头删除一个item元素
        9. remove_rear()从队尾删除一个item元素
        10. is_empty() 判断双端队列是否为空
        11. size() 返回队列的大小

        栗子:

        from collections import deque
        dq = deque([1,2])
        #向这个队列后端插入‘a’
        dq.append('a')
        #向这个队列前端插入‘b’
        dq.appendleft('b')
        #双印这个双端队列
        print('插入数据后的队列',dq)
        #向第二个位置插入数字3
        dq.insert(2,3)
        #取数据
        print(dq.pop())
        print(dq.pop())
        print(dq.popleft())
        #双印这个双端队列
        print('取出数据后的队列',dq)
        输出结果:
        插入数据后的队列 deque(['b', 1, 2, 'a'])
        a
        2
        b
        取出数据后的队列 deque([1, 3])
        image.gif

        插入数据的流程:

        image.gif编辑

        👤五、defaultdict 方法

          • 👥defaultdict 方法详述

          有如下值集合 [11,22,33,44,55,66,77,88,99,90],将所有大于 66 的值保存至字典中的k1中,将小于 66 的值保存至k2的值中。

          即: {'k1': 大于66, 'k2': 小于66}按以前的做法如果要保存至字典的字典中没有k1或k2,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict

          如何使用defaultdict呢?

          defaultdict接受一个工厂函数作为参数,如下来构造:

          dict =defaultdict( factory_function)
          image.gif

          这个factory_function必须是可以调用的可以是list、set、str等等,作用是当key不存在时,返回的是工厂函数的默认值,比如list对应[ ],str对应的是空字符串,set对应set( ),int对应0,简单来说defaultdict在我们操作字典中没有的键时,会自动创建而不会报错,且你可以指定自动创建的键对应的值的默认类型,通过改变factory_function

          from collections import defaultdict
          values = [11, 22, 33,44,55,66,77,88,99,90]
          my_dict = defaultdict(list)
          for value in  values:
              if value>66:
                  my_dict['k1'].append(value)
              else:
                  my_dict['k2'].append(value)
          输出结果:
          defaultdict(<class 'list'>, {'k2': [11, 22, 33, 44, 55, 66], 'k1': [77, 88, 99, 90]})
          image.gif
            • 👥知识点拓展之定义字典的冷门方法

            按平常我们会这样定义一个字典d:

            d = {'a' : 1,'b' : 2,'c' : 3}
            image.gif

            但其实上面这个字典也可以这样定义:

            d = dict([('a' :1),('b' : 2),('c' : 3)])
            image.gif

            但这两种方法定义的字典的键都是无序的,如果想要得到一个键为有序的字典还是得用defaultdict 方法

            👤六、Counter方法

            方法用到的地方不多,主要是记录字符串中相同值出现的次数

            Counter类的目的是用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value。计数值可以是任意的Interger(包括0和负数)。Counter类和其他语言的bags或multisets很相似。

            from collections import Counter
            c = Counter('abcdeabcdabcaba')
            print(c)
            输出结果:
            Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})


            相关文章
            |
            2月前
            |
            SQL 关系型数据库 数据库
            Python SQLAlchemy模块:从入门到实战的数据库操作指南
            免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
            356 7
            |
            2月前
            |
            监控 安全 程序员
            Python日志模块配置:从print到logging的优雅升级指南
            从 `print` 到 `logging` 是 Python 开发的必经之路。`print` 调试简单却难维护,日志混乱、无法分级、缺乏上下文;而 `logging` 支持级别控制、多输出、结构化记录,助力项目可维护性升级。本文详解痛点、优势、迁移方案与最佳实践,助你构建专业日志系统,让程序“有记忆”。
            259 0
            |
            2月前
            |
            JSON 算法 API
            Python中的json模块:从基础到进阶的实用指南
            本文深入解析Python内置json模块的使用,涵盖序列化与反序列化核心函数、参数配置、中文处理、自定义对象转换及异常处理,并介绍性能优化与第三方库扩展,助你高效实现JSON数据交互。(238字)
            391 4
            |
            2月前
            |
            Java 调度 数据库
            Python threading模块:多线程编程的实战指南
            本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
            290 0
            |
            2月前
            |
            XML JSON 数据处理
            超越JSON:Python结构化数据处理模块全解析
            本文深入解析Python中12个核心数据处理模块,涵盖csv、pandas、pickle、shelve、struct、configparser、xml、numpy、array、sqlite3和msgpack,覆盖表格处理、序列化、配置管理、科学计算等六大场景,结合真实案例与决策树,助你高效应对各类数据挑战。(238字)
            204 0
            |
            3月前
            |
            安全 大数据 程序员
            Python operator模块的methodcaller:一行代码搞定对象方法调用的黑科技
            `operator.methodcaller`是Python中处理对象方法调用的高效工具,替代冗长Lambda,提升代码可读性与性能。适用于数据过滤、排序、转换等场景,支持参数传递与链式调用,是函数式编程的隐藏利器。
            142 4
            |
            3月前
            |
            存储 数据库 开发者
            Python SQLite模块:轻量级数据库的实战指南
            本文深入讲解Python内置sqlite3模块的实战应用,涵盖数据库连接、CRUD操作、事务管理、性能优化及高级特性,结合完整案例,助你快速掌握SQLite在小型项目中的高效使用,是Python开发者必备的轻量级数据库指南。
            320 0
            |
            4月前
            |
            存储 安全 数据处理
            Python 内置模块 collections 详解
            `collections` 是 Python 内置模块,提供多种高效数据类型,如 `namedtuple`、`deque`、`Counter` 等,帮助开发者优化数据处理流程,提升代码可读性与性能,适用于复杂数据结构管理与高效操作场景。
            356 0
            |
            5月前
            |
            数据安全/隐私保护 Python
            抖音私信脚本app,协议私信群发工具,抖音python私信模块
            这个实现包含三个主要模块:抖音私信核心功能类、辅助工具类和主程序入口。核心功能包括登录
            |
            8月前
            |
            Python
            Python教程:os 与 sys 模块详细用法
            os 模块用于与操作系统交互,主要涉及夹操作、路径操作和其他操作。例如,`os.rename()` 重命名文件,`os.mkdir()` 创建文件夹,`os.path.abspath()` 获取文件绝对路径等。sys 模块则用于与 Python 解释器交互,常用功能如 `sys.path` 查看模块搜索路径,`sys.platform` 检测操作系统等。这些模块提供了丰富的工具,便于开发中处理系统和文件相关任务。
            368 14

            推荐镜像

            更多