哈喽大家好,我是咸鱼
我们知道字典是 Python 中最重要且最有用的内置数据结构之一,它们无处不在,是语言本身的基本组成部分
我们可以使用字典来解决许多编程问题,那么今天我们就来看看如何在 Python 中遍历字典
全文内容:https://realpython.com/iterate-through-dictionary-python/
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
需要注意的是:
- 字典将键映射到值,并将它们存储在数组或集合中。键值对通常称为 items
- 字典键必须是可哈希类型,这意味着它们必须具有在键的生命周期内永远不会更改的哈希值
与序列不同,序列是支持使用整数索引进行元素访问的可迭代对象,字典按键编制索引。这意味着我们可以使用关联的键而不是整数索引来访问存储在字典中的值
字典中的键很像 set
,它是可哈希和唯一对象的集合。由于键需要可哈希处理,因此不能将可变对象用作字典键(即键不能是可变数据类型)
另一方面,字典值可以是任何 Python 类型,无论它们是否可哈希。从字面上看,对值没有任何限制。我们可以使用任何数据类型作为 Python 字典中的值
在Python 3.6之前,字典是无序的数据结构。这意味着 item 的顺序通常与插入顺序不匹配
>>> # Python 3.5
>>> likes = {"color": "blue", "fruit": "apple", "pet": "dog"}
>>> likes
{'color': 'blue', 'pet': 'dog', 'fruit': 'apple'}
可以看到,生成的词典中 item 的顺序与最初插入 item 的顺序不匹配
在 Python 3.6 及更高版本中,字典的键和值保持与将它们插入底层字典的顺序相同。即从3.6 开始,字典变成了紧凑有序的数据结构
>>> # Python 3.6
>>> likes = {"color": "blue", "fruit": "apple", "pet": "dog"}
>>> likes
{'color': 'blue', 'fruit': 'apple', 'pet': 'dog'}
保持 item 有序是一个非常有用的功能。但是,如果使用的代码支持较旧的 Python 版本,则不能依赖此功能,因为它可能生成 bug,对于较新的版本,依赖该特性是完全安全的
字典的另一个重要特征是它们是可变的数据类型。这意味着我们可以根据需要就地添加、删除和更新其项目
值得注意的是,这种可变性也意味着不能将字典用作另一个字典中的键
如何在 python 中遍历字典
Python 开发人员经常会遇到这样的情况:在对其键值对执行某些操作时,需要遍历现有字典
因此,了解 Python 中字典迭代的不同方法非常重要。保持 item 有序是一个非常有用的功能
- 直接遍历字典
Python 的字典有一些特殊的方法,Python 在内部使用它们来执行一些操作
这两个方法的命名约定是,在方法名的开头和末尾分别添加两个下划线
可以使用内置 dir()
函数获取任何 Python 对象提供的方法和属性的列表。如果使用空字典作为参数运行 dir()
,则将获得 dict
该类的所有方法和属性
>>> dir({})
['__class__', '__contains__', '__delattr__', ... , '__iter__', ...]
可以看到'__iter__'
这个属性,这是 Python 在需要容器数据类型的迭代器时自动调用的方法
该方法应该返回一个新的迭代器对象,该对象允许我们遍历底层容器类型中的所有项
对于 Python 字典,默认情况下允许 .__iter__()
直接迭代键。如果你直接在 for
循环中使用字典,Python 将自动调用 .__iter__()
属性,你会得到一个遍历其键的迭代器
>>> likes = {"color": "blue", "fruit": "apple", "pet": "dog"}
>>> for key in likes:
... print(key)
...
color
fruit
pet
Python 足够聪明,知道 likes 是一个字典,并且它实现了.__iter__()
。在这个例子中,Python自动调用.__iter__()
,这允许迭代 likes 字典的键
这是在 Python 中遍历字典的主要方法——你只需要把字典直接放进一个 for
循环中
如果将此方法与 [key]
运算符一起使用,则可以在循环访问键时访问字典的值
>>> for key in likes:
... print(key, "->", likes[key])
...
color -> blue
fruit -> apple
pet -> dog
在本例中,同时使用 key
和 likes[key]
来分别访问目标字典的键和值
尽管在 Python 中直接遍历字典非常简单,但字典提供了更方便、更明确的工具来获得相同的结果
.items()
该方法就是这种情况,它定义了一种快速迭代字典的 item 或键值对的方法
.items()
方法遍历字典 item
使用字典时,同时循环访问键和值可能是一个常见要求。 .items()
方法返回一个视图对象,其中包含字典的项作为键值元组:
>>> likes = {"color": "blue", "fruit": "apple", "pet": "dog"}
>>> likes.items()
dict_items([('color', 'blue'), ('fruit', 'apple'), ('pet', 'dog')])
字典视图对象提供字典项的动态视图。在这里,动态意味着当字典更改时,视图会反映这些更改
视图是可迭代的,因此我们可以使用调用 .items()
生成的视图对象循环访问字典中的项,如以下示例所示:
>>> for item in likes.items():
... print(item)
.