问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Python 遍历字典的若干方法

发布网友 发布时间:2024-09-07 07:47

我来回答

1个回答

热心网友 时间:2024-12-13 23:51

哈喽大家好,我是咸鱼

我们知道字典是 Python 中最重要且最有用的内置数据结构之一,它们无处不在,是语言本身的基本组成部分

我们可以使用字典来解决许多编程问题,那么今天我们就来看看如何在 Python 中遍历字典

全文内容: realpython.com/iterate-...

ps:文中提到的 Python 指的是 CPython 实现;

译文如下:

字典是 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

需要注意的是:

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

字典中的键很像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] 运算符一起使用,则可以在循环访问键时访问字典的值

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

还可以更简洁

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

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

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

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

更简洁的写法

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

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

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

字典推导式

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

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

更简洁的方法如下:

zip() 函数从原始列表生成键值对,而 dict() 构造函数负责创建新字典
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
电脑上制作相册时转换源文件用电脑如何制作相册视频 二十四节气立秋的特点 立秋的来历和风俗-今日头条 立秋这个节气的特点 立秋节气的特点和由来-今日头条 怎么设置电脑键盘灯光笔记本怎么开键盘背光 苹果电脑win10键盘灯怎么开 苹果电脑win10键盘灯打开方法 为什么我电脑CPU 什么都不运行温度还100以上? 麻烦大家看看我的cpu温度不稳定 电脑cpu热怎么解决电脑cpu过热要怎么解决 电脑cpu温度高怎么解决办法 船用螺旋桨厂家 python列表里面有字典,该怎么读取字典中的value? 我是一个不自信的人,如何改变自己呢? 我是一个不自信的人其表现是 林恒小说主角名字 治疗青光眼的眼药水 降眼压眼药水哪个最好 治眼压高的眼药水 描述婚礼的句子 婚宴感谢词精美句子 有哪些婚宴感谢句子 青光眼有哪些治疗药物 1967年阴历九月二十四是什么星座? 青光眼手术后用什么眼药水 ...睾丸两侧.阴囊潮湿一抓都是灰还特别痒 大腿两边有长像痘痘一... 18岁男生~经常阴囊潮湿~而且附近的皮肤长了痘痘~特别痒~怎么回事... 拼多多无货源中转仓详细介绍 国网绿rgb色号国网绿 嗓子里有点痰,老是咳嗽,在有粉尘的地方工作,怕自己得了尘肺,就在齐鲁医... 周五夜放克紫悦错误化模组下载 周五夜放克紫悦错误化模组安卓APK如何下载 生物考研,细胞生物学怎么样啊?不知道就业前景如何,高手指教!·_百度... Python字典的循环遍历 -遍历key、遍历value、遍历键值对、遍历键值对... 水泥地面不平如何打磨 佩戴狼牙有什么好处 20岁的我被一起上班的女同事都很爱欺负我 i don't believe that anybody feels the way i do about you 是哪首... 院里种什么盆景最旺宅 庭院栽什么盆景最好最旺风水 院内摆什么最旺宅 室内种什么盆景好 10个针脚的数字表怎样接线? 请帮我看下一下,图片中当中的那个接口,就是10针的那个接口,是什么接 ... 我坐标安徽合肥,国庆准备出去自驾游,往山西方向走,怎么规划路线呢_百 ... 哪些茶叶农药残留最少 安全喝茶,哪些茶不打农药的可能性大一些? 什么茶叶农药残留最多,什么茶最容易农药超标? 《最强蜗牛》孔雀翎属性介绍介绍_《最强蜗牛》孔雀翎属性介绍是什么 功夫熊猫序篇沈王爷怎么样 沈王爷技能属性详解[图]-手游攻略-游戏鸟手 ... 成为偶函数的条件 空头增仓是什么意思 空头增仓价格为什么还涨