返回介绍

字典用法注意事项

发布于 2024-01-29 22:24:16 字数 2885 浏览 0 评论 0 收藏 0

一旦你熟练掌握了字典,它将成为相当简单的工具,但是在使用字典时,有几点需要注意:

·序列运算无效。字典是映射机制,不是序列。因为字典元素间没有顺序的概念,类似串联(有序合并)和分片(提取相邻片段)这样的运算是不能用的。实际上,如果你试着这样做,Python会在你的程序运行时报错。

·对新索引赋值会添加项。当你编写字典常量时(此时的键是嵌套于常量本身的),或者向现有字典对象的新键赋值时,都会生成键。最终的结果是一样的。

·键不一定总是字符串。我们的例子中都使用字符串作为键,但任何不可变对象(也就是说,不是列表)也是可以的。例如,你可以用整数作为键,这样让字典看起来很像列表(至少进行索引时很像)。元组偶尔允许合并键值时也可以用作字典键。只要它有合适的协议方法,类实例对象(我们将在本书第六部分进行讨论)也可以用作键。大体上来讲,它需要告诉Python其值不变,否则作为固定键将会毫无用处。

使用字典模拟灵活的列表

前面的表中的最后一点非常重要,我们应举些例子来说明一下。当使用列表的时候,对在列表末尾外的偏移赋值是非法的:

虽然你可以使用重复按所需预先分配足够大的列表(例如,[0]*100),但你也可以用字典来做类似的事情,这样就不需要这样的空间分配了。使用整数键时,字典可以效仿列表在偏移赋值时增长:

在这里,看起来似乎D是一个有100项的列表,但其实是一个有单个元素的字典;键99的值是字符串'spam'。你可以像列表那样用偏移访问这一结构,但你不需要为将来可能会用到的会被赋值的所有位置都分配空间。像这样使用时,字典很像更具灵活性的列表。

字典用于稀疏数据结构

类似地,字典键也常用于实现稀疏数据结构。例如,多维数组中只有少数位置上有存储的值:

在这里,我们用字典表示一个三维数组,这个数组中只有两个位置(2,3,4)和(7,8,9)有值,其他位置都为空。键是元组,它们记录非空元素的坐标。我们并不是分配一个庞大而几乎为空的三维矩阵,而是用一个简单的两个元素的字典。通过这一方式读取空元素时,会触发键不存在的异常,因为这些元素实质上并没有存储:

避免missing-key错误

读取不存在的键的错误在稀疏矩阵中很常见,然而我们可能并不希望程序因为这一错误被关闭。在这里至少有三种方式可以让我们填入默认值而不会出现这样的错误提示:你可以在if语句中预先对键进行测试,也可以使用try语句明确地捕获并修复这一异常,还可以用我们前面介绍的get方法为不存在的键提供一个默认值:

从编程的需要方面来说,get方法是这三者中最简捷的。我们将在本书稍后部分详细介绍if和try语句。

使用字典作为“记录”

就像本书所介绍的,字典在Python中能够扮演多种角色。一般来说,字典可以取代搜索数据结构(因为用键进行索引是一种搜索操作),并且可以表示多种结构化信息的类型。例如,字典是在程序范围中多种描述某一项属性的方法之一。也就是说,它们能够扮演与其他语言中“记录”和“结构”相同的角色。

这是一个随时间通过向新键赋值来填写字典的例子:

特别是在嵌套的时候,Python的内建数据类型可以很轻松地表达结构化信息。这个例子再一次使用字典来捕获对象的属性,但它是一次性写好(并没有对每个键分别赋值),而且嵌套了一个列表和一个字典来表达结构化属性的值:

当读取嵌套对象的元素时,只要简单地把索引操作串起来就可以了:

尽管我们将来在本书第四部分学习这些类(它们既按照数据也按照逻辑分组)时,它可能比这里用做记录的用途更好,但字典是满足简单需求的一种易用的工具。

为什么要在意字典接口

除了作为一种能够在程序中通过键存储信息的简便方法之外,有些Python的扩展程序也提供了外表类似并且实际工作都和字典一样的接口。例如,Python的DBM接口通过键来获取文件,它看上去特别像一个已经打开的字典。字符串的读取都使用键索引:

稍后,我们将会看到如果你把刚才那段程序代码中的anydbm换成shelve(shelve是通过键来访问的Python持久对象的数据库),那么你也可以用这种方式储存整个Python对象。就互联网而言,Python的CGI脚本支持的一个接口看上去也跟字典类似。一个对cgi.FieldStorage范围的调用会产生一个类似字典的对象,在客户端网页上每个输入字段都有一项:

所有这些(以及字典)都是映射的例子。一旦你学习了字典接口,你就会发现字典接口适用于Python各种内置工具。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文