字典实战——基本字典操作 | 第二部分 类型与操作 —— 第 8 章: 列表和字典 |《学习 python:强大的面向对象编程(第 5 版)》| python 技术论坛-金年会app官方网
在普通操作中,使用字面量创建字典并通过键和索引来存储和访问项目:
% python
>>> d = {'spam': 2, 'ham': 1, 'eggs': 3} # make a dictionary
>>> d['spam'] # fetch a value by key
2
>>> d # order is "scrambled"
{'eggs': 3, 'spam': 2, 'ham': 1}
这里,字典被分配给变量d;键 'spam' 的值是整数2,等等。使用和通过偏移量索引列表同样的方括号语法,通过键来索引字典,但这里意味着通过键而非位置来访问。
注意这个例子的结尾——很像sets,在字典中键的从左往右的顺序几乎总是和原来键入的不同(译注:在3.10中不是这样了)。这是故意的:要实现快速键查找(又名:哈希),键需要在内存中重新排序。这就是为什么假设固定从左往右顺序的操作(比如:切片,连接)不适用于字典;只能通过键获取值,不能通过位置。技术上讲,顺序是伪随机的——它不是真的随机(如果有python源码和大量的时间可以消磨,就可以破译它),但它是任意的,而且可能跟随版本和平台不同,甚至是python 3.3的每个交互式会话。
内置 len
函数也适用于字典;它返回字典中存储的项的数量或等价地,字典的键列表的长度。字典的 in
成员操作符允许测试键是否存在,且 keys
方法返回字典中的所有键。这些方法的后者对按特定顺序处理字典是很有用的,但不应该依赖于键列表的顺序。然而,因为键的结果可以被用作一个普通列表,如果顺序很重要,它总是可以被排序(更多关于排序和字典参见后面):
>>> len(d) # number of entries in dictionary
3
>>> 'ham' in d # key membership test alternative
true
>>> list(d.keys()) # create a new list of d's keys
['eggs', 'spam', 'ham']
观察这个代码列表的第二个表达式。如前提到的,用于字符串和列表的in
成员测试也适用于字典——它检查了键是否存储在字典中。技术上讲,这是可行的,因为字典定义了自动地遍历它们的键列表的迭代器。其它类型提供了反映它们的通常用法的迭代器;比如,文件有逐行读的迭代器。将在第14章和第20章更正式地讨论迭代器。
还要注意这个代码列表中的最后一个例子的语法。在python 3.3中为了类似原因,必须将其包裹在 list
调用中——3.x中的键返回一个可迭代对象,而非一个物理列表。 list
调用强制它同时产生所有的值,以至于我们可以交互式地打印它们,然而这个调用在其它一些情况下不是必须的。在 2.x中,keys
构建和返回了一个真实的列表,所以甚至不需要列表调用来展示结果;关于这个的更多知识请参见本章稍后部分。