Python强大的内置模块collections

2023-10-27

1. 模块说明

collections 是 Python 的一个内置模块,所谓内置模块的意思是指 Python 内部封装好的模块,无需安装即可直接使用。

  • collections 包含了一些特殊的容器,针对 Python 内置的容器,例如:list、dict、set、tuple,提供了另一种选择;

  • namedtuple:可以创建包含名称的 tuple;

  • deque:类似于 list 的容器,可以快速的在队列头部和尾部添加、删除元素;

  • OrderedDict:dict的子类,可以记住元素的添加顺序;

  • defaultdict:dict的子类,可以调用提供默认值的函数;

  • Counter:dict的子类,计算可hash的对象;

2. 实战代码

(1). testNamedTuple函数

Python 提供了很多非常好用的基本类型,比如不可变类型 tuple,我们可以轻松地用它来表示一个二元向量。

namedtuple 是一个函数,它用来创建一个自定义的 tuple 对象,并且规定了 tuple 元素的个数,并可以用属性而不是索引来引用 tuple 的某个元素。

如此一来,我们用 namedtuple 可以很方便地定义一种数据类型,它具备 tuple 的不变性,又可以根据属性来引用,使用十分方便。

本示例中我们使用了一个三维坐标 x,y,z 来定义一个 tuple 对象,对象元素有3个,然后通过坐标值来引用相应的值即可。

from collections import namedtuple
from collections import deque
from collections import defaultdict
from collections import OrderedDict
from collections import Counter


def testNamedTuple():
    vector=namedtuple('vector',['x','y','z'])
    flag=vector(3,4,5)
    print(type(flag))
    print(isinstance(flag,vector))
    print(isinstance(flag,tuple)) #通过这里的判定我们就可以知晓它是元组类型
    print(flag.x,flag.y,flag.z)

(2). testDeque函数

deque是栈和队列的一种广义实现,deque是 "double-end queue" 的简称;

deque支持线程安全、有效内存地以近似O(1)的性能在 deque 的两端插入和删除元素,尽管 list 也支持相似的操作,但是它主要在固定长度操作上的优化,从而在 pop(0) 和 insert(0,v)(会改变数据的位置和大小)上有O(n)的时间复杂度。

在数据结构中,我们知道队列和堆栈是两个非常重要的数据类型,一个先进先出,一个后进先出。

在 python 中,使用 list 存储数据时,按索引访问元素很快,但是插入和删除元素就很慢,因为 list 是线性存储,数据量大的时候,插入和删除效率很低。

deque是为了高效实现插入和删除操作的双向链表结构,非常适合实现队列和堆栈这样的数据结构。

def testDeque():
    list1=[x*x for x in range(101)]
    delist=deque(list1) #对列表进行了一次再处理,让list1列表变成了双向链表结构
    delist.append(1000)#将x添加到deque的右侧
    delist.appendleft(2000)#将x添加到deque的左侧
    delist.pop(1000)#移除和返回deque中最右侧的元素,如果没有元素,将会报出IndexError;
    delist.popleft()#移除和返回deque中最左侧的元素,如果没有元素,将会报出IndexError;
    delist.count(1)#返回deque中元素等于1的个数
    delist.remove(10000)#移除第一次出现的value,如果没有找到,报出ValueError;
    delist.reverse()#反转deque中的元素,并返回None;
    list2=[1,3,4,5]
    delist.extend(list2)#将可迭代变量iterable中的元素添加至deque的右侧
    delist.extendleft(list2)#将变量iterable中的元素添加至deque的左侧,往左侧添加序列的顺序与可迭代变量iterable中的元素相反
    delist.maxlen()#只读的属性,deque的最大长度,如果无解,就返回None
    delist.rotate(1)#从右侧反转n步,如果n为负数,则从左侧反转
    delist.clear()#将deque中的元素全部删除,最后长度为0;

(3). testDefaultdict函数

defaultdict是内置数据类型 dict 的一个子类,基本功能与 dict 一样,只是重写了一个方法__missing__(key)和增加了一个可写的对象变量 default_factory。

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

def testDefaultdict():
    dict1= defaultdict(lambda: 'default') #Key不存在时,返回一个默认值,就可以用default,defaultdict的其他行为跟dict是完全一样的
    dict1["k1"]="v1"
    print(dict1["k2"])

    list2= [('yellow',11),('blue',2),('yellow',3),('blue',4),('red',5),('red',10)]
    dict1 = defaultdict(list)#使用list作为default_factory,很容易将一个key-value的序列转换为一个关于list的词典
    for k,v in list2:
        dict1[k].append(v)
    print(dict1)

(4). testOrderedDict函数

OrderedDict类似于正常的词典,只是它记住了元素插入的顺序,当在有序的词典上迭代时,返回的元素就是它们第一次添加的顺序。这样 dict 就是一个有序的字典。

使用 dict 时,key 是无序的。在对 dict 做迭代时,我们无法确定 key 的顺序。但是如果想要保持 key 的顺序,可以用 OrderedDict。

def testOrderedDict():
    dict1=dict([('aaa', 111), ('ddd',444),('bbb', 222), ('ccc', 333)])
    print(dict1)

    dict2 = OrderedDict([('ddd',444),('aaa', 111), ('bbb', 222), ('ccc', 333)])#OrderedDict的key会按照插入的顺序排列,不是key本身排序
    print(dict2)

    dict3 = {"banana": 33, "apple": 222, "pear": 1, "orange": 4444}
    # dict sorted by key
    dict4=OrderedDict(sorted(dict3.items(), key=lambda t: t[0]))
    print("dict4",dict4)
    # dict sorted by value
    dict5=OrderedDict(sorted(dict3.items(), key=lambda t: t[1]))
    print("dict5",dict5)
    # dict sorted by length of key string
    dict6 = OrderedDict(sorted(dict3.items(), key=lambda t: len(t[0])))
    print("dict6",dict6)
    print(dict6['apple'])

(5). testCounter函数

def testCounter():
    '''counter可以支持方便、快速的计数'''
    str1="abcdefgabcedergeghdjlkabcdefe" #将可迭代的字符串初始化counter
    str2=Counter(str1)
    print(str2) #从输出的内容来看,Counter实际上也是dict的一个子类
    for k,v in str2.items():
        print(k,v)

    dict3 = {"banana": 33, "apple": 222, "pear": 1, "orange": 4444,"apples":2}#将dict初始化counter
    dict4=Counter(dict3)
    print(dict4)
    print(dict4["test"])#Counter对象类似于字典,如果某个项缺失,会返回0,而不是报出KeyError;

    dict5=Counter(high=9,age=33,money=-1)#将args初始化counter
    print(dict5)
    #elements返回一个迭代器,每个元素重复的次数为它的数目,顺序是任意的顺序,如果一个元素的数目少于1,那么elements()就会忽略它;
    list1=list(dict5.elements())
    print(list1)

    #most_common返回一个列表,包含counter中n个最大数目的元素
    #,如果忽略n或者为None,most_common()将会返回counter中的所有元素,元素有着相同数目的将会以任意顺序排列;
    str1 = "abcdefgabcedergeghdjlkabcdefe"
    list1=Counter(str1).most_common(3)
    print(list1)

if __name__ == '__main__':
    # testNamedTuple()
    # testCounter()
    testDefaultdict()
    # testDeque()
    # testOrderedDict()

欢迎关注【无量测试之道】公众号,回复【领取资源】

Python+Unittest框架API自动化、

Python+Unittest框架API自动化、

Python+Pytest框架API自动化、

Python+Pandas+Pyecharts大数据分析、

Python+Selenium框架Web的UI自动化、

Python+Appium框架APP的UI自动化、

Python编程学习资源干货、

Vue前端组件化框架开发、

资源和代码 免费送啦~
文章下方有公众号二维码,可直接微信扫一扫关注即可。

备注:我的个人公众号已正式开通,致力于IT互联网技术的分享。

包含:数据分析、大数据、机器学习、测试开发、API接口自动化、测试运维、UI自动化、性能测试、代码检测、编程技术等。

微信搜索公众号:“无量测试之道”,或扫描下方二维码:

  在这里插入图片描述

添加关注,让我们一起共同成长!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python强大的内置模块collections 的相关文章

  • Django 代理模型的继承和多态性

    我正在开发一个我没有启动的 Django 项目 我面临着一个问题遗产 我有一个大模型 在示例中简化 称为MyModel这应该代表不同种类的物品 的所有实例对象MyModel应该具有相同的字段 但方法的行为根据项目类型的不同而有很大差异 到目
  • Django 管理员在模型编辑时间歇性返回 404

    我们使用 Django Admin 来维护导出到我们的一些站点的一些数据 有时 当单击标准更改列表视图来获取模型编辑表单而不是路由到正确的页面时 我们会得到 Django 404 页面 模板 它是偶尔发生的 我们可以通过重新加载三次来重现它
  • SQLAlchemy 通过关联对象声明式多对多自连接

    我有一个用户表和一个朋友表 它将用户映射到其他用户 因为每个用户可以有很多朋友 这个关系显然是对称的 如果用户A是用户B的朋友 那么用户B也是用户A的朋友 我只存储这个关系一次 除了两个用户 ID 之外 Friends 表还有其他字段 因此
  • OpenCV Python cv2.mixChannels()

    我试图将其从 C 转换为 Python 但它给出了不同的色调结果 In C Transform it to HSV cvtColor src hsv CV BGR2HSV Use only the Hue value hue create
  • PyUSB 1.0:NotImplementedError:此平台不支持或未实现操作

    我刚刚开始使用 pyusb 基本上我正在玩示例代码here https github com walac pyusb blob master docs tutorial rst 我使用的是 Windows 7 64 位 并从以下地址下载 z
  • 是否可以忽略一行的pyright检查?

    我需要忽略一行的pyright 检查 有什么特别的评论吗 def create slog group SLogGroup data Optional dict None SLog insert one SLog group group da
  • 测试 python Counter 是否包含在另一个 Counter 中

    如何测试是否是pythonCounter https docs python org 2 library collections html collections Counter is 包含在另一个中使用以下定义 柜台a包含在计数器中b当且
  • 基于代理的模拟:性能问题:Python vs NetLogo & Repast

    我正在 Python 3 中复制一小段 Sugarscape 代理模拟模型 我发现我的代码的性能比 NetLogo 慢约 3 倍 这可能是我的代码的问题 还是Python的固有限制 显然 这只是代码的一个片段 但 Python 却花费了三分
  • Spark KMeans 无法处理大数据吗?

    KMeans 有几个参数training http spark apache org docs latest api python pyspark mllib html highlight kmeans pyspark mllib clus
  • 如何在ipywidget按钮中显示全文?

    我正在创建一个ipywidget带有一些文本的按钮 但按钮中未显示全文 我使用的代码如下 import ipywidgets as widgets from IPython display import display button wid
  • Python 的“zip”内置函数的 Ruby 等价物是什么?

    Ruby 是否有与 Python 内置函数等效的东西zip功能 如果不是 做同样事情的简洁方法是什么 一些背景信息 当我试图找到一种干净的方法来进行涉及两个数组的检查时 出现了这个问题 如果我有zip 我可以写这样的东西 zip a b a
  • IO 密集型任务中的 Python 多线程

    建议仅在 IO 密集型任务中使用 Python 多线程 因为 Python 有一个全局解释器锁 GIL 只允许一个线程持有 Python 解释器的控制权 然而 多线程对于 IO 密集型操作有意义吗 https stackoverflow c
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe
  • 向 Altair 图表添加背景实心填充

    I like Altair a lot for making graphs in Python As a tribute I wanted to regenerate the Economist graph s in Mistakes we
  • 如何在 Python 中追加到 JSON 文件?

    我有一个 JSON 文件 其中包含 67790 1 kwh 319 4 现在我创建一个字典a dict我需要将其附加到 JSON 文件中 我尝试了这段代码 with open DATA FILENAME a as f json obj js
  • 有人用过 Dabo 做过中型项目吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们正处于一个新的 ERP 风格的客户端 服务器应用程序的开始阶段 该应用程序是作为 Python 富客户端开发的 我们目前正在评估 Dabo
  • 使用其构造函数初始化 OrderedDict 以便保留初始数据的顺序的正确方法?

    初始化有序字典 OD 以使其保留初始数据的顺序的正确方法是什么 from collections import OrderedDict Obviously wrong because regular dict loses order d O
  • 发送用户注册密码,django-allauth

    我在 django 应用程序上使用 django alluth 进行身份验证 注册 我需要创建一个自定义注册表单 其中只有一个字段 电子邮件 密码将在服务器上生成 这是我创建的表格 from django import forms from
  • Python Selenium:如何在文本文件中打印网站上的值?

    我正在尝试编写一个脚本 该脚本将从 tulsaspca org 网站获取以下 6 个值并将其打印在 txt 文件中 最终输出应该是 905 4896 7105 23194 1004 42000 放置的动物 的 HTML span class
  • 如何将输入读取为数字?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 Why are x and y下面的代码中使用字符串而不是整数 注意 在Python 2

随机推荐

  • vue简单实现点击加1功能

    实现点击按钮输入框里 1 这里选择自己的vue地址 div div
  • Python爬虫入门教程:爬取csdn文章保存成PDF

    本文的文字及图片来源于网络 仅供学习 交流使用 不具有任何商业用途 如有问题请及时联系我们以作处理 基本开发环境 Python 3 6 Pycharm wkhtmltopdf 相关模块的使用 pdfkit requests parsel 安
  • 如何查看服务器内存及cpu信息,查看服务器当前内存cpu信息

    查看服务器当前内存cpu信息 内容精选 换一换 设备实时状态查询是检测设备在运行过程中的状态信息 用户可任选以下指令之一查看设备实时状态查询命令的可用参数 ascend dmi i hascend dmi i help各参数解释如表1所示
  • Mask-RCNN中的损失函数

    对每个ROI来说 多任务损失函数如下 mask分支对于每个RoI有Km2 维度的输出 K个 类别数 分辨率为m m的二值mask 因此作者利用了a per pixel sigmoid 并且定义 Lmask 为平均二值交叉熵损失 the av
  • ORA-12638: 身份证明检索失败 的解决办法

    the NTS option makes the Oracle client attempt to use your current Windows domain credentials to authenticate you with t
  • 水星路由器设置成交换机

    修改LAN口就可以
  • 两个esp8266透传用法

    电赛校赛在5月末结束 写一下这残酷的心路历程 得了校一哈哈哈 应该的应该的 毕竟花的钱比别的组少 先讲一下小车通信模块WiFi 老师说我们小题大做了 可是学通信用蓝牙太屈才啦 找遍全网都是这样连 这是错的 困扰了我们好久 差点退货 RST跟
  • python中的模块和包

    文章目录 Python中的模块 模块的具体使用 Python中的包 Python中的模块 模块 module 模块化 模块化指将一个完整的程序分解为一个一个小的模块 通过将模块组合 来搭建出一个完整的程序 不采用模块化 统一将所有的代码编写
  • java 纯面向对象_为什么Java不是纯面向对象的编程语言?

    1 首先我们将了解什么是面向对象的语言 当我们谈论所有关于对象的事物时 即 基于对象的数据表示 基于对象的方法表示 2 Java不是纯面向对象的 这意味着我们可以用或不用对象来表示数据 即 不用对象就可以表示很少的数据意味着不需要对象 情况
  • QT常用界面设计组件----SpinBox

    控件简介 SpinBox用于整数的显示与输入 一般显示为十进制 也可以显示二进制和十六进制的数 而且可以在显示框增加前缀和后缀 QDoubleSpinBox用于浮点数的显示和输入 可以设置显示小数位数 也可以设置显示的前缀和后缀 它们都是Q
  • linux-修改主机名的正确方式

    序 面对大量服务器 我们希望每一台服务器都有自己的名字 这样便于使用和管理 修改主机名 就是修改下图中这个位置的名字 修改主机名的方法主要有临时生效和永久生效两种 1 临时生效 所谓临时生效 就是在服务器不重启的情况下 临时改变主机名 通过
  • Type Library

    Type Library A typelib stores information about a COM object The classid the interfaces that the object supports the met
  • 自定义异常(实现登录)

    目录 异常 在Java中 将程序执行过程中发生的不正常行为称为异常 为什么要自定义异常呢 实现异常 用户登录功能 前言 在写自定义异常之前 我们要先简单了解何为异常 为什么要自定义异常 异常 在Java中 将程序执行过程中发生的不正常行为称
  • UI和UI有什么不同,是如何协助的

    UX 用户体验 和UI 用户界面 是一个常用的术语 然而 尽管有复杂的联系 但网页设计的两个领域是两个不同的东西 事实上 有可能有一个用户界面优秀但用户体验差的网站 因此 了解UX和UI良好的网页设计非常重要 这里简要介绍一下 UX和UI它
  • 数据库的设计(E-R图,数据库模型图,三大范式)

    一 数据库设计的概念 数据库设计是将数据库中的数据实体及这些数据实体之间的关系 进行规划和结构化的过程 二 数据库设计的重要性 如果一个数据库没有进行一个良好的设计 那么这个数据库完成之后他的缺点是 1 效率会很低 2更新和检索数据时会出现
  • SpringMVC使用stringHttpMessageConverter

    SpringMVC使用stringHttpMessageConverter 场景演示 解决方法 场景演示 当使用 ReponseBody注解的时候 我们知道返回值会被转换成 Json格式 然而里面的中文可能会被转换成乱码 如下面代码中的 测
  • 18.一篇文章,从源码深入详解ThreadLocal内存泄漏问题

    1 造成内存泄漏的原因 threadLocal是为了解决对象不能被多线程共享访问的问题 通过threadLocal set方法将对象实例保存在每个线程自己所拥有的threadLocalMap中 这样每个线程使用自己的对象实例 彼此不会影响达
  • 【笔记总结】C++面向对象三大特征(四大特征)

    C 面向对象的三大特征 四大特征 三大特征 封装 继承 多态 四大特征 抽象 封装 继承 多态 一 类和对象 什么是类 什么是对象 类和对象的区别 类是数据类型 是具有相同属性和服务的一组对象的集合 对一类对象的抽象就是类 对象即观察研究对
  • 转换vmware的vmdk格式为qcow2格式

    一 系统环境 操作系统 Win11 虚机系统 VMware Workstation 16 Pro 16 2 3 build 19376536 转换工具 qemu 8 0 2 二 下载安装qemu模拟器 查看qemu版本 Download Q
  • Python强大的内置模块collections

    1 模块说明 collections 是 Python 的一个内置模块 所谓内置模块的意思是指 Python 内部封装好的模块 无需安装即可直接使用 collections 包含了一些特殊的容器 针对 Python 内置的容器 例如 lis