Python 遍历字典的若干方法

news2024/11/26 3:46:43

字典是 Python 的基石。这门语言的很多方面都是围绕着字典构建的

模块、类、对象、globals()locals() 都是字典与 Python 实现紧密联系的例子

以下是 Python 官方文档定义字典的方式:

An associative array, where arbitrary keys are mapped to values. The keys can be any object with __hash__() and __eq__() methods

需要注意的是:

  • 字典将键映射到值,并将它们存储在数组或集合中。键值对通常称为 items

  • 字典键必须是可哈希类型,这意味着它们必须具有在键的生命周期内永远不会更改的哈希值

与序列不同,序列是支持使用整数索引进行元素访问的可迭代对象,字典按键编制索引。这意味着我们可以使用关联的键而不是整数索引来访问存储在字典中的值

字典中的键很像 set ,它是可哈希和唯一对象的集合。由于键需要可哈希处理,因此不能将可变对象用作字典键(即键不能是可变数据类型)

另一方面,字典值可以是任何 Python 类型,无论它们是否可哈希。从字面上看,对值没有任何限制。我们可以使用任何数据类型作为 Python 字典中的值

在Python 3.6之前,字典是无序的数据结构。这意味着 item 的顺序通常与插入顺序不匹配

保持 item 有序是一个非常有用的功能。但是,如果使用的代码支持较旧的 Python 版本,则不能依赖此功能,因为它可能生成 bug,对于较新的版本,依赖该特性是完全安全的

字典的另一个重要特征是它们是可变的数据类型。这意味着我们可以根据需要就地添加、删除和更新其项目

值得注意的是,这种可变性也意味着不能将字典用作另一个字典中的键

如何在 python 中遍历字典

Python 开发人员经常会遇到这样的情况:在对其键值对执行某些操作时,需要遍历现有字典

因此,了解 Python 中字典迭代的不同方法非常重要。保持 item 有序是一个非常有用的功能

  • 直接遍历字典

Python 的字典有一些特殊的方法,Python 在内部使用它们来执行一些操作

这两个方法的命名约定是,在方法名的开头和末尾分别添加两个下划线

可以使用内置 dir() 函数获取任何 Python 对象提供的方法和属性的列表。如果使用空字典作为参数运行 dir() ,则将获得 dict 该类的所有方法和属性

可以看到'__iter__' 这个属性,这是 Python 在需要容器数据类型的迭代器时自动调用的方法

该方法应该返回一个新的迭代器对象,该对象允许我们遍历底层容器类型中的所有项

对于 Python 字典,默认情况下允许 .__iter__() 直接迭代键。如果你直接在 for 循环中使用字典,Python 将自动调用 .__iter__() 属性,你会得到一个遍历其键的迭代器

Python 足够聪明,知道 likes 是一个字典,并且它实现了.__iter__()。在这个例子中,Python自动调用.__iter__(),这允许迭代 likes 字典的键

这是在 Python 中遍历字典的主要方法——你只需要把字典直接放进一个 for 循环中

如果将此方法与 [key] 运算符一起使用,则可以在循环访问键时访问字典的值

在本例中,同时使用 keylikes[key] 来分别访问目标字典的键和值

尽管在 Python 中直接遍历字典非常简单,但字典提供了更方便、更明确的工具来获得相同的结果

.items() 该方法就是这种情况,它定义了一种快速迭代字典的 item 或键值对的方法

  • .items()方法遍历字典 item

使用字典时,同时循环访问键和值可能是一个常见要求。.items() 方法返回一个视图对象,其中包含字典的项作为键值元组:

字典视图对象提供字典项的动态视图。在这里,动态意味着当字典更改时,视图会反映这些更改

视图是可迭代的,因此我们可以使用调用 .items() 生成的视图对象循环访问字典中的项,如以下示例所示:

在此示例中, 返回一个视图对象,该对象一次生成一个键值对, .items() 并允许我们循环访问它们

如果仔细观察产生的各个项目 .items() ,那么会注意到它们是 tuple 对象:

可以看到所有的 item 都是元组。一旦知道了这一点,就可以使用元组解包来并行地遍历键和值

要通过键和值实现并行迭代,只需将每个 item 的元素解压缩为两个不同的变量:一个用于键,另一个用于值

for 循环头中的 key 和 value 变量执行解包操作。每次循环运行时,key获得对当前键的引用,value获得对值的引用

这样,我们就可以更好地控制字典内容。因此,我们将能够以可读和 python 的方式分别处理键和值

  • .keys() 方法遍历字典的键

Python 字典提供了第二种遍历其键的方法。除了在循环中直接使用目标字典外,还可以使用.keys()方法

这个方法返回一个只包含字典键的视图对象

该方法 .keys() 返回一个对象,该对象提供 likes 键的动态视图。可以使用此视图对象循环访问字典键

当您在 likes上调用 .keys() 时,将获得键的视图。Python 知道视图对象是可迭代的,所以它开始循环

为什么要使用 .keys() 而不是直接遍历字典。简单来说,显式地使用 .keys()可以让你更好地表达只遍历键的意图

  • .values() 方法遍历字典值

在遍历字典时面临的另一个常见需求是只遍历值。方法是使用 .values() 方法,它会返回一个包含底层字典中的值的视图

上面的代码返回一个视图对象, .values() 返回一个视图对象。

与其他视图对象一样,的结果 .values() 也是可迭代的,因此可以在循环中使用它

使用 .values() ,只能访问目标字典的值

  • 在迭代期间更改值

有时在 Python 中迭代字典时需要更改字典中的值

在下面的例子中,你在一个字典中更新了一堆产品的价格:

在上面的例子中需要注意的是:为了更新值,我们使用了原始的字典,而不是像price = round(price * 0.9, 2)这样直接更新当前的价格

如果像price = round(price * 0.9, 2)这样,重新分配水果或价格并没有反映在原来的字典中

就会导致丢失对字典的引用,这样并没有实现更改字典中的任何内容

  • 在迭代期间安全地删除 item

由于 Python 字典是可变的,我们可以根据需要从中删除现有的 item

在下面的示例中,我们根据项的特定值选择性地删除项

注意,为了在遍历字典时安全地缩小字典,我们需要使用一个副本

在本例中,使用 .copy() 创建目标字典fruits的浅副本。然后循环遍历副本,同时从原始字典中删除项,在本例中,使用 del 语句删除字典项

但是也可以使用 .pop() 将目标键作为参数

如果在尝试删除循环中的 item 时不使用目标词典的副本,则会收到错误

当你试图在迭代过程中从字典中删除一个 item 时,Python 会引发 RuntimeError

由于原始字典的大小发生了变化,因此如何继续迭代是不明确的。因此,要避免这个问题,请始终在迭代中使用字典的副本

遍历期间对字典的操作

  • 根据值来过滤 item

有时候我们希望在原字典的前提下创建一个只包含满足特定条件的新字典

我们可以在遍历原字典的时候加上条件判断

在此示例中,筛选值小于的项目 2 ,并将它们添加到 small_numbers 字典中

还有另一种技术可以用来从字典中过滤 item。因为键的视图对象类似于 Python 集合对象

因此,它们支持集合操作,例如并集、交集和差分。可以利用这种类似集合的行为从字典中过滤某些键

还可以更简洁

或者通过计算字典的键与一组不需要的键之间的差分而获得的键集构建一个新词典

  • 算术运算

在遍历字典时,我们可以对字典的值进行计算

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

或者使用内置的 sum() 函数。把字典中的值作为参数直接传递给 sum() 来求和

  • 键值交换

我们可以在遍历的时候交换字典的键和值

更简洁的写法

需要注意的是,原始字典值中的数据必须是可哈希数据类型

我们还可以将内置 zip() 函数与 dict() 构造函数一起使用

上面的示例中,通过 zip() 生成值键对的元组,然后,使用生成的元组作为参数并 dict() 构建所需的字典

字典推导式

与列表推导式不同,字典推导式需要一个映射到值的键

上面的对象中, zip() 接收两个可迭代对象( categoriesobjects )生成了一个 tuple 对象,然后被解压缩到 keyvalue 中,最终用于创建新的所需字典

更简洁的方法如下:

zip() 函数从原始列表生成键值对,而 dict() 构造函数负责创建新字典

---------------------------END---------------------------

题外话

在这里插入图片描述

感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。

👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img
img

二、Python必备开发工具

工具都帮大家整理好了,安装就可直接上手!img

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、Python视频合集

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

五、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

六、面试宝典

在这里插入图片描述

在这里插入图片描述

简历模板在这里插入图片描述

👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

若有侵权,请联系删除

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/973475.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器人中的数值优化(十二)——带约束优化问题简介、LP线性规划

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,…

移动端App持续集成体系构建实战

这里写目录标题 一、目标1、前言2、优势:3、涉及技术点4、目标 二、测试app构建、打包过程1、安卓打包的环境要求 三、演示安卓源码打包四、演示安卓App部署1、前提条件2、命令控制apk安装与卸载 五、安卓UI自动化测试1、Appium app自动化测试-Python2、实现的验证点…

Vue3+Ts实现父子组件间传值的两种方式

文章目录 写在前面1、v-modelemit传值1.1父向子传递数据1.2子向父传递数据 2、使用v-bindemit2.1父向子传递数据2.2子向父传递数据 总结 写在前面 对于常用的组件间传参最近有了有点小心得总结一下,主要是两种子向父组件传参的方式总结。欢迎评论区讨论 概览&…

Linux的服务器日志分析及性能调优

作为网络安全和数据传输的重要环节,代理服务器在现代互联网中扮演着至关重要的角色。然而,在高负载情况下,代理服务器可能面临性能瓶颈和效率问题。本文将介绍如何利用Linux系统对代理服务器进行日志分析,并提供一些实用技巧来优化…

数组模拟实现环形队列

目录 前言 一、什么是队列? 二、数组模拟非环形队列的实现 三 . 数组模拟环形队列 总结 前言 笔者: 最爱吃兽奶 博文内容: 数据结构队列的模拟实现 这篇博客理解起来或许没有那么简单,我尽力讲的容易理解一点,接下来跟我一起去看看吧! 一、什么是队列? 队列是一种特殊…

#452. 序列操作

序列操作 - 题目 - Daimayuan Online Judge 问题描述: 思路:首先想的是第二次操作的y可以将前面所以操作进行抵消,只需要第二次操作的最大值即可。但是发现,对于第一个操作,它是单点修改,每修改一次对于第…

2023年7月京东投影仪行业品牌销售排行榜(京东大数据)

鲸参谋监测的京东平台7月份投影仪行业销售数据已出炉! 7月份,投影仪市场呈现增长趋势。根据鲸参谋平台的数据可知,7月京东平台投影仪的销量将近20万,同比增长约16%;销售额将近3.8亿,同比增长约4%。 ​*数据…

机器人中的数值优化(十一)——高斯牛顿法、LMF方法、Dogleg方法

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,…

MySQL——MySQL的基础操作部分

使用命令行登录 mysql -u root -p 直接敲击回车后输入密码即可: 当看到出现“mysql>“的符号之后,就表示已经进入到了MySQL系统中,就可以输入My&#xf…

Streamlit项目:乐高风格马赛克设计工坊~打造个性化马赛克图案的平台

文章目录 1 前言2 项目概述2.1 项目背景和目标2.2 功能和特性2.3 技术实现2.4 开发计划2.5 预期成果2.6 应用场景 3 使用指南3.1 源代码使用指南3.2 普通网页用户使用指南3.3 文件保存3.3.1 导出图像文件3.3.2 获取像素RGB数据 3.4 注意事项 4 实现细节4.1 准备工作4.2 编写代码…

如何手动读取 GLTF/GLB 文件

推荐:使用NSDT场景编辑器快速搭建3D应用场景 文件类型 GLTF文件有两种不同的主要文件类型:.gltf和.glb。 GLTF文件本质上只是一个重新命名的json文件,它们通常与包含顶点数据等内容的.bin文件相提并论,但这些内容也可以直接包含…

聊聊大模型位置编码及其外推性

作者 | 王嘉宁 整理 | NewBeeNLP https://wjn1996.blog.csdn.net/article/details/131753251 大家好,这里是 NewBeeNLP。 现如今很多大模型都开始支持超过4096长度的推理,例如GPT-4支持超过30k,ChatGLM2-6B也支持最长为32K的文本。但是由于显…

CentOS7安装时直接跳过了安装信息摘要页面的解决方法

最近在配置Hadoop虚拟机的时候,创建的centos7虚拟机在安装信息摘要时直接自动跳过,直接跳到设置用户名和密码,在重复多次的重新删除安装后发现了问题所在: 在进行到选择操作系统来源时,注意是否出现“该操作系统将使用…

matplotlib设置绘图中文标记

项目场景 使用matplotlib时为图形设置x轴标记,y轴标记,标题默认只能使用英文,当使用中文时会出现以下错误: UserWarning: Glyph 32654 (\N{CJK UNIFIED IDEOGRAPH-7F8E}) missing from current font. 解决方法 在引入matplotl…

成功的硬件公司不仅是产品,更是一种创新文化

目录 内容简介 客户 建立公司,而不仅仅是产品 CSDN学院 作者简介 内容简介 很多时候,你决定去做一件事、一款产品,往往都始于一个想法、一个灵感。 然后,许多硬件创业者会花费数月、甚至是数年的时间来确定并分析他们的想法…

基于ITIL的ITSM工具

随着企业的ITSM(IT服务管理)的逐渐成熟进而深入应用,如果您希望以低成本寻找一款基于ITIL的ITSM管理工具,然后那么卓豪ServiceDesk Plus将是您性价比高的免费ITSM、工单系统选择。因为它提供全面的ITSM和资产管理能力,更重要的是,…

java八股文面试[多线程]——CompletableFuture

1 CompletableFuture介绍 平时多线程开发一般就是使用Runnable,Callable,Thread,FutureTask,ThreadPoolExecutor这些内容和并发编程息息相关。相对来对来说成本都不高,多多使用是可以熟悉这些内容。这些内容组合在一起…

全国唯一一所初试考Java的学校!平均300分拿下

苏州科技大学 考研难度(☆) 内容:23考情概况(拟录取和复试分析)、院校概况、23专业目录、23复试详情、各专业考情分析、各科目考情分析。 正文1187字,预计阅读:3分钟 2023考情概况 苏州科技…

澳大利亚纽扣电池/含纽扣电池商品合规认证详细解答

近期收到很多客户前来咨询亚马逊澳洲站纽扣电池或含纽扣电池商品的合规性认证,和我说我做了认证了,为什么还是审核不通过,审核被拒呢? 一般是两种情况: 一:检测标准没有做对或对亚马逊合规政策的标准有误…

四川玖璨电子商务有限公司:短视频及直播运营

​ 短视频及直播运营是当下最火热的互联网行业之一,它以轻松、有趣的方式改变了人们的生活和娱乐方式。作为一名短视频及直播运营实训学员,我有幸得到了具体的操作指导和实践机会,让我对这个行业有了更深入的了解。 在短视频及直…