当前位置: 首页 > news >正文

python容器模块Collections

Python附带一个模块,它包含许多容器数据类型,名字叫作collections

defaultdict

defaultdict与dict类型不同,你不需要检查key是否存在,所以我们能这样做:

from collections import defaultdict
colours = (('Yasoob', 'Yellow'),('Ali', 'Blue'),('Arham', 'Green'),('Ali', 'Black'),('Yasoob', 'Red'),('Ahmed', 'Silver'),
)
favourite_colours = defaultdict(list)
for name, colour in colours:favourite_colours[name].append(colour)
print(favourite_colours)

运行输出:

# defaultdict(<type 'list'>,
#    {'Arham': ['Green'],
#     'Yasoob': ['Yellow', 'Red'],
#     'Ahmed': ['Silver'],
#     'Ali': ['Blue', 'Black']
# })

另一种重要的是例子就是:当你在一个字典中对一个键进行嵌套赋值时,如果这个键不存在,会触发keyError异常。 defaultdict允许我们用一个聪明的方式绕过这个问题。
首先我分享一个使用dict触发KeyError的例子,然后提供一个使用defaultdict的解决方案。
问题:

some_dict = {}
some_dict['colours']['favourite'] = "yellow"
## 异常输出:KeyError: 'colours'

解决方案:

import collections
tree = lambda: collections.defaultdict(tree)
some_dict = tree()
some_dict['colours']['favourite'] = "yellow"
## 运行正常

你可以用json.dumps打印出some_dict,例如:

import json
print(json.dumps(some_dict))
## 输出: {"colours": {"favourite": "yellow"}}

counter

Counter是一个计数器,它可以帮助我们针对某项数据进行计数。比如它可以用来计算每个人喜欢多少种颜色:

from collections import Counter
colours = (('Yasoob', 'Yellow'),('Ali', 'Blue'),('Arham', 'Green'),('Ali', 'Black'),('Yasoob', 'Red'),('Ahmed', 'Silver'),
)
favs = Counter(name for name, colour in colours)
print(favs)
## 输出:
## Counter({
##     'Yasoob': 2,
##     'Ali': 2,
##     'Arham': 1,
##     'Ahmed': 1
##  })

我们也可以在利用它统计一个文件,例如:

with open('filename', 'rb') as f:line_count = Counter(f)
print(line_count)

3、deque

deque提供了一个双端队列,你可以从头/尾两端添加或删除元素。要想使用它,首先我们要从collections中导入deque模块:

from collections import deque

现在,你可以创建一个deque对象。

d = deque()

它的用法就像python的list,并且提供了类似的方法,例如:

d = deque()
d.append('1')
d.append('2')
d.append('3')
print(len(d))
## 输出: 3
print(d[0])
## 输出: '1'
print(d[-1])
## 输出: '3'

你可以从两端取出(pop)数据:

d = deque(range(5))
print(len(d))
## 输出: 5
d.popleft()
## 输出: 0
d.pop()
## 输出: 4
print(d)
## 输出: deque([1, 2, 3])

我们也可以限制这个列表的大小,当超出你设定的限制时,数据会从对队列另一端被挤出去(pop)。
最好的解释是给出一个例子:

d = deque(maxlen=30)

现在当你插入30条数据时,最左边一端的数据将从队列中删除。

你还可以从任一端扩展这个队列中的数据:

d = deque([1,2,3,4,5])
d.extendleft([0])
d.extend([6,7,8])
print(d)
## 输出: deque([0, 1, 2, 3, 4, 5, 6, 7, 8])

4、namedtuple

您可能已经熟悉元组。
一个元组是一个不可变的列表,你可以存储一个数据的序列,它和命名元组(namedtuples)非常像,但有几个关键的不同。
主要相似点是都不像列表,你不能修改元组中的数据。为了获取元组中的数据,你需要使用整数作为索引:

man = ('Ali', 30)
print(man[0])
## 输出: Ali

嗯,那namedtuples是什么呢?它把元组变成一个针对简单任务的容器。你不必使用整数索引来访问一个namedtuples的数据。你可以像字典(dict)一样访问namedtuples,但namedtuples是不可变的。

from collections import namedtuple
Animal = namedtuple('Animal', 'name age type')
perry = Animal(name="perry", age=31, type="cat")
print(perry)
## 输出: Animal(name='perry', age=31, type='cat')
print(perry.name)
## 输出: 'perry'

现在你可以看到,我们可以用名字来访问namedtuple中的数据。我们再继续分析它。一个命名元组(namedtuple)有两个必需的参数。它们是元组名称和字段名称。

在上面的例子中,我们的元组名称是Animal,字段名称是’name’,’age’和’type’。
namedtuple让你的元组变得自文档了。你只要看一眼就很容易理解代码是做什么的。
你也不必使用整数索引来访问一个命名元组,这让你的代码更易于维护。
而且,namedtuple的每个实例没有对象字典,所以它们很轻量,与普通的元组比,并不需要更多的内存。这使得它们比字典更快。

然而,要记住它是一个元组,属性值在namedtuple中是不可变的,所以下面的代码不能工作:

from collections import namedtuple
Animal = namedtuple('Animal', 'name age type')
perry = Animal(name="perry", age=31, type="cat")
perry.age = 42
## 输出:
## Traceback (most recent call last):
##     File "", line 1, in
## AttributeError: can't set attribute

你应该使用命名元组来让代码自文档,它们向后兼容于普通的元组,这意味着你可以既使用整数索引,也可以使用名称来访问namedtuple:

from collections import namedtuple
Animal = namedtuple('Animal', 'name age type')
perry = Animal(name="perry", age=31, type="cat")
print(perry[0])
## 输出: perry

最后,你可以将一个命名元组转换为字典,方法如下:

from collections import namedtuple
Animal = namedtuple('Animal', 'name age type')
perry = Animal(name="Perry", age=31, type="cat")
print(perry._asdict())
## 输出: OrderedDict([('name', 'Perry'), ('age', 31), ...

相关文章:

python容器模块Collections

Python附带一个模块&#xff0c;它包含许多容器数据类型&#xff0c;名字叫作collections defaultdict defaultdict与dict类型不同&#xff0c;你不需要检查key是否存在&#xff0c;所以我们能这样做&#xff1a; from collections import defaultdict colours ((Yasoob, Y…...

排序算法学习记录-快速排序

快速排序 快速排序关键在于确定一个中间值&#xff0c;使得小于这个中间值的数在左边&#xff0c;大于这个中间值的数在右边。那么中间值该如何确定呢&#xff1f;有以下几种做法 首元素&#xff0c;也就是arr[l]尾元素&#xff0c;也就是arr[r]中间元素&#xff0c;也就是ar…...

安装windows版本的ros2 humble的时候,最后报错

"[rti_connext_dds_cmake_module][warning] RTI Connext DDS environment script not found (\resource\scripts\rtisetenv_x64Win64VS2017.bat). RTI Connext DDS will not be available at runtime, unless you already configured PATH manually." 意思是没找到。…...

Nginx 学习(十)高可用中间件的配置与实现

一 Keepalived热备 1 概述 调度器出现单点故障&#xff0c;如何解决?Keepalived实现了高可用集群Keepalived最初是为LVS设计的&#xff0c;专门监控各服务器节点的状态Keepalived后来加入了VRRP功能&#xff0c;防止单点故障 2 运行原理 Keepalived检测每个服务器节点状…...

[刷题记录]牛客面试笔刷TOP101

牛客笔试算法必刷TOP101系列,每日更新中~ 1.合并有序链表2023.9.3 合并两个排序的链表_牛客题霸_牛客网 (nowcoder.com) 题意大致为: 将两个链表中的元素按照从小到大的顺序合并成为一个链表. 所给予的条件: 给出的所要合并的链表都是从小到大顺序排列的. 思路: 创建一…...

降水预报之双重惩罚

在降水预报中&#xff0c;通常会出现 "双重惩罚问题 "的指标或度量包括那些常用于预报验证的指标或度量。当假阴性&#xff08;漏报降水事件&#xff09;和假阳性&#xff08;误报&#xff09;受到同等惩罚或加权时&#xff0c;就会出现双重惩罚问题&#xff0c;这在…...

一条SQL语句的执行过程(附一次两段式提交)

一条SQL语句的完整执行过程是怎样的呢&#xff1f;我们用select和update语句来举例。 注意在mysql8后&#xff0c;进入服务层后&#xff0c;取消了去查询缓存(属于Server服务层)这个步骤&#xff0c;缓存中key是SQL语句&#xff0c;value是值&#xff0c;这样其实并不会提升性…...

Python基础知识详解:数据类型、对象结构、运算符完整分析

文章目录 python基础知识数据类型类型检查对象&#xff08;object&#xff09;对象的结构变量和对象类型转换运算符(操作符)1. 算术运算符2. 赋值运算符3. 比较运算符&#xff08;关系运算符&#xff09;4. 逻辑运算符5. 条件运算符&#xff08;三元运算符&#xff09; 总结 py…...

基于Streamlit的应用如何通过streamlit-authenticator组件实现用户验证与隔离

Streamlit框架中默认是没有提供用户验证组件的&#xff0c;大家在基于streamlit快速实现web应用服务过程中&#xff0c;不可避免的需要配置该应用的访问范围和权限&#xff0c;即用户群体&#xff0c;一般的做法有两种&#xff0c;一种是通过用户密码验证机制&#xff0c;要求只…...

[虚幻引擎插件介绍] DTGlobalEvent 蓝图全局事件, Actor, UMG 相互回调,自由回调通知事件函数,支持自定义参数。

本插件可以在虚幻的蓝图 Actor&#xff0c; Obiect&#xff0c;UMG 里面指定绑定和执行消息&#xff0c;可带自定义参数。 参数支持 Bool&#xff0c;Byte&#xff0c;Int&#xff0c;Int64&#xff0c;Float&#xff0c;Name&#xff0c;String&#xff0c;Text&#xff0c;Ve…...

2023数学建模国赛选题建议及BC题思路

大家好呀&#xff0c;全国大学生数学建模竞赛今天下午开赛啦&#xff0c;在这里先带来初步的选题建议及思路。 目前团队正在写B题和C题完整论文&#xff0c;后续还会持续更新哈&#xff0c;以下只是比较简略的图文版讲解&#xff0c;团队目前正在写B、C题完整论文&#xff0c;…...

vue3:4、组合式API-setup选项

setup每次都要return&#xff0c;好麻烦。怎么解决&#xff1f; 使用 <script setup> 语法糖&#xff08;底层帮你return了&#xff09; 写法如下...

【C刷题训练营】第三讲(c语言入门训练)

前言: 大家好&#xff0c;我决定日后逐渐更新c刷题训练营的内容&#xff0c;或许能帮到入门c语言的初学者&#xff0c;如果文章有错误&#xff0c;非常欢迎你的指正&#xff01; &#x1f4a5;&#x1f388;个人主页:​​​​​​Dream_Chaser&#xff5e; &#x1f388;&…...

简述视频智能分析EasyCVR视频汇聚平台如何通过“AI+视频融合”技术规避八大特殊作业风险

视频智能分析EasyCVR视频汇聚平台可以根据不同的场景需求&#xff0c;让平台在内网、专网、VPN、广域网、互联网等各种环境下进行音视频的采集、接入与多端分发。在视频能力上&#xff0c;视频云存储平台EasyCVR可实现视频实时直播、云端录像、视频云存储、视频存储磁盘阵列、录…...

2023年9月NPDP产品经理国际认证报名,找弘博创新

产品经理国际资格认证NPDP是新产品开发方面的认证&#xff0c;集理论、方法与实践为一体的全方位的知识体系&#xff0c;为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会&#xff08;PDMA&#xff09;成立于1979年&#xff0c;是…...

【MySQL】MySQL的安装,登录,配置和相关命令

文章目录 前言一. 卸载不需要的环境二. 获取MySQL的yum源三. 安装MySQL和启动四. 尝试登录MySQL方法1&#xff1a;获取临时root密码方法2&#xff1a;没有密码方法3&#xff1a;配置文件 五. 简单配置结束语 前言 本篇文章是基于云服务器&#xff1b;Linux&#xff1a;Centos7…...

攻防世界-WEB-php_rce

打开靶机链接 搜村ThinkPhP V5存在远程命令执行的漏洞 构建payload /index.php?sindex/think\app/invokefunction&functioncall_user_func_array&vars[0]system&vars[1][]ls 查询当前目录文件&#xff0c;没有发现flag。调整payload 得到flag文件&#xff0c;修…...

WRFDA资料同化实践技术

数值预报已经成为提升预报质量的重要手段&#xff0c;而模式初值质量是决定数值预报质量的重要环节。资料同化作为提高模式初值质量的有效方法&#xff0c;成为当前气象、海洋和大气环境和水文等诸多领域科研、业务预报中的关键科学方法。资料同化新方法的快速发展&#xff0c;…...

C++11新特性② | 左值、左值引用、右值与右值引用

目录 1、引言 2、值类别及相关概念 3、左值、右值 4、左值引用、右值引用 5、移动语义 5.1、为什么需要移动语义 5.2、移动语义定义 5.3、转移构造函数 5.4、转移赋值函数 6、标准库函数 std::move 7、完美转发 std::forward VC常用功能开发汇总&#xff08;专栏文章…...

Python Opencv实践 - Harris角点检测

参考资料&#xff1a;https://blog.csdn.net/wsp_1138886114/article/details/90415190 import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/chinease_tower.jpg", cv.IMREAD_COLOR) plt.imshow(img[:,:,::-1])#…...

我用了半年只留下这1个!2026年录音怎么转换成文字亲测准确率真的超高

我前后用了大半年录音转文字工具&#xff0c;试了免费小工具、大厂办公套件自带功能、好几个专门做转写的产品&#xff0c;踩了一堆坑之后最终只留了一个——听脑AI。作为常年要整理课堂录音、调研访谈的学生党&#xff0c;我可以负责任说&#xff0c;2026年做录音转文字&#…...

JWT权限治理:从无状态凭证到可管控权限单元

1. 这不是又一个“登录后跳转首页”的玩具项目JWT在Java Web权限控制里被讲烂了&#xff0c;但绝大多数人写的所谓“基于JWT的系统”&#xff0c;其实连Token刷新都靠前端定时重登&#xff0c;后端连黑名单都没建&#xff0c;更别提并发登出、设备绑定、权限粒度动态变更这些真…...

零和博弈 vs 正和系统:用强化学习原理破解组织内耗

1. 项目概述&#xff1a;从办公室茶水间到算法沙盒&#xff0c;零和与正和到底在争什么&#xff1f;你有没有经历过这样的场景&#xff1a;部门刚拿到一笔季度奖金池&#xff0c;五个人分三十万。A悄悄把B的客户案例写进自己的述职PPT&#xff1b;C在跨组协作时故意延迟交付&am…...

从B73到5000个RILs:手把手拆解玉米NAM群体构建的完整流程与关键决策

玉米NAM群体构建全流程解析&#xff1a;从亲本筛选到RILs优化的科学决策 站在玉米遗传研究的十字路口&#xff0c;我们常常面临一个核心挑战&#xff1a;如何在有限资源下构建既能捕获广泛遗传多样性&#xff0c;又能实现精准定位的群体&#xff1f;2009年&#xff0c;Buckler团…...

Logback 日志框架使用与配置指南

1. Logback 核心概念与架构 Logback 是 Java 生态中最主流的日志框架之一&#xff0c;其配置体系主要围绕以下三个核心概念展开&#xff1a; Logger&#xff08;日志记录器&#xff09;&#xff1a;负责捕获日志事件。它通过 name 属性&#xff08;通常是包名或类名&#xff09…...

Spring Cloud Feign本地调试路由增强方案设计与实现

1. 项目概述&#xff1a;当Feign遇上本地调试的“网络鸿沟”在微服务架构里混迹多年的老手&#xff0c;对OpenFeign这个组件肯定不陌生。它用起来确实爽&#xff0c;一个接口加几个注解&#xff0c;服务间的远程调用就像调用本地方法一样简单&#xff0c;把HTTP通信的复杂性都封…...

图片去水印怎么做?2026年最全图片去水印工具推荐与方法盘点

在日常工作和生活中&#xff0c;我们常常会遇到带有水印的图片——无论是社交平台的截图、素材库的图片&#xff0c;还是从各类网站下载的资源。水印虽然保护了原作者的权益&#xff0c;但有时也会影响我们对内容本身的使用。那么&#xff0c;图片去水印有哪些实用方法&#xf…...

本地视频怎么去水印?2026本地视频去水印软件推荐与方法合集

不少朋友都会碰到一个烦恼&#xff1a;从抖音、快手、小红书下载的视频都带着水印&#xff0c;自己录制的视频也会被社交平台自动添加水印。想要去掉这些水印用于素材库或后期编辑&#xff0c;却不知道该怎么办。别急&#xff0c;今天就给你盘点2026年最实用的本地视频去水印方…...

视频硬字幕提取神器:3分钟将任何视频字幕转为可编辑SRT文件

视频硬字幕提取神器&#xff1a;3分钟将任何视频字幕转为可编辑SRT文件 【免费下载链接】video-subtitle-extractor 视频硬字幕提取&#xff0c;生成srt文件。无需申请第三方API&#xff0c;本地实现文本识别。基于深度学习的视频字幕提取框架&#xff0c;包含字幕区域检测、字…...

【收藏干货】2026年AI Coding全面爆发!程序员终极职业升级攻略,告别被替代焦虑

2026年&#xff0c;AI编码技术迎来规模化落地爆发期&#xff0c;行业彻底告别“人工纯编码”的传统模式。对于所有程序员而言&#xff0c;当下最核心的生存与发展策略&#xff0c;早已不是埋头敲代码&#xff0c;而是从“被动写代码的执行者”全面升级为“主动驾驭AI的价值创造…...