字典实战——基本字典操作

未匹配的标注

在普通操作中,使用字面量创建字典并通过键和索引来存储和访问项目:

% 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构建和返回了一个真实的列表,所以甚至不需要列表调用来展示结果;关于这个的更多知识请参见本章稍后部分。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~