Python 遍历字典的若干方法

作者&投稿:苑陶 (若有异议请与网页底部的电邮联系)
~ 哈喽大家好,我是咸鱼

我们知道字典是 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() 构造函数负责创建新字典


哈密地区13489822851: 如何遍历Python的字典序列 -
漫须先嗪: 首先实现Python中遍历字典序列:d = {'Liu' : 24,'Zhang' :25,'Chen' : 23} for name in d:print name+"'s age is",d[name]>>Chen's age is 23>>Liu's age is 24>>Zhang's age is 25 如上结果所示可以实现遍历,作为一个Python新手,我注意到在单引...

哈密地区13489822851: python怎么遍历字典的key -
漫须先嗪: aDict = {'key1':'value1', 'key2':'value2', 'key3':'value3'} print '-----------dict-------------' for d in aDict:print "key: %s" %(d, )

哈密地区13489822851: python如何无限遍历字典中的value,在不知道字典里面有几层字典的时候 -
漫须先嗪: 递归. 用这个函数把dict里面的所有value用递归的方法提取到一个空list里面1 2 3 4 5 6 7 8 9 10 11 12 13defdict2flatlist(d,l):print(d)forx ind.keys():iftype(d[x]) ==dict:dict2flatlist(d[x],l)else:l.append(d[x])d ={1:"a",2:"b",3:{4:"c",5:"d",6:{7:"e"}},8:"f"}l =[] dict2flatlist(d,l) print(l) 希望对你有帮助

哈密地区13489822851: 我怎么才能把python的字典里面的数据按照原始顺序遍历出来 -
漫须先嗪: 方式:1 t = paramiko.transport(("ip地址","端口"))2 t.connect(username = “用户名”, password = “口令”)3 如果连接远程主机需要提供密钥,上面第二行代码可改成:4 t.connect(username = “用户名”, password = “口令”, hostkey=”密钥”)

哈密地区13489822851: python 怎样同时遍历两个字典 -
漫须先嗪: dict1={'1': ('a', 'b', 'c', 'd'), '2': ('f', 'w',你估计根本没有把这些内容用python运行过吧?看我给你改的 合并2个字典

哈密地区13489822851: Python如何遍历另一个py文件中的字典? -
漫须先嗪: 1. from a import dict 最好把a.py放b.py旁边 2. for k in dict: print(k) print(dict[k])

哈密地区13489822851: python怎样遍历dictionart -
漫须先嗪: python的字典不是初始化后就不能再变了吗? 比如 我有一群人的名字 name=[jack,tom,lily] 还有他们各自的年龄 age=[17,19,20] 字典的初始化不是 dict={}.fromkeys((name),0 ) 吗 假设我的名字是一个一个出现的,一开始不知道所有的名字

哈密地区13489822851: python 字典怎样当作参数传入函数里,以及在 -
漫须先嗪: # -*- coding:utf-8 -*- #py3 ''' python 字典当作函数参数,及遍历 ''' def f(di): //定义函数for key in di: //两种方式遍历字典print(key,':',di[key])for key,value in di.items():print(key,'-',value)dic={1:'a',2:3,3:'test',4:100} f(dic)

哈密地区13489822851: python怎样顺序查询字典中的键 -
漫须先嗪: dict使用items()遍历字典的方法(python3是items(),python2是iteritems()). dict1 = {'a': 2, 'b': 3, 'c': 2 }def dict(value):for k, v in dict1.items():if v == value:print("{%s: %s}" % (k, v))dict(2)

哈密地区13489822851: 如何用Python写脚本遍历词典提取中文文本中一样的词语并做出标记 -
漫须先嗪: 词典?数据格式贴一下吧?----------------------------------- 遍历每一个元素,然后用正则去匹配.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网