返回介绍

Python 3.0 中的字典变化

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

本章到目前为止还是关注于在不同版本中可用的字典的基本知识,但是,字典的功能在Python 3.0中已经有所变化。如果你使用Python 2.X代码,可能会遇到表现不同的字典工具,或者干脆在Python 3.0中取消的字典工具。此外,Python 3.0代码也会使用在Python 2.0中所没有的工具。具体来说,Python 3.0中的字典:

·支持一种新的字典解析表达式,这是列表和集合解析的“近亲”。

·对于D.key、D.values和D.items方法,返回可迭代的视图,而不是列表。

·由于前面一点,需要新的编码方式通过排序键来遍历。

·不再直接支持相对大小比较——取而代之的是手动比较。

·不再有D.has_key方法——相反,使用in成员关系测试。

让我们看看在Python 3.0中的字典有什么新特性。

字典解析

正如上一小节末尾提到的,Python 3.0中的字典也可以用字典解析来创建。就像我们在第5章中遇到的集合解析一样,字典解析也只在Python 3.0中可用(Python 2.6中不可用)。就像较早的时候我们在第4章中以及在本章开始简单介绍过的列表解析一样,字典解析也隐式地运行一个循环,根据每次迭代收集表达式的键/值结果,并且使用它们来填充一个新的字典。一个循环变量允许解析在过程中使用循环迭代值。

例如,在Python 2.6和Python 3.0中,动态初始化一个字典的标准方式都是:将其键和值对应起来并把结果传递给dict调用。正如我们将在本书第13章学习到的,zip函数是在一个单个调用中从键和值的列表来构建一个字典的方式之一。如果不能在代码中预计键和值的集合,总是可以将它们构建为列表然后再对应起来:

在Python 3.0中,可以用一个字典解析表达式来实现同样的效果。如下代码使用对应结果(它的样子和在Python代码中几乎相同,只不过更正式一些)中的每一个键/值对构建了一个新的字典:

这个例子中,解析实际上需要更多的代码,但是,它们也比这个例子所暗示的要更为通用——我们可以使用它们把单独的一串值映射到字典,并且键和值一样,也可以用表达式来计算:

字典解析对于从键列表来初始化字典也很有用,这和我们在前一小节末尾遇到的fromkeys方法很相似:

和相关的工具一样,字典解析支持这里没有介绍的额外的语法,包括嵌套循环和if子句。遗憾的是,要真正理解字典解析,我们还需要了解Python中有关迭代语句和概念的更多知识,并且,我们目前还没有足够的信息来介绍这些内容。我们将在第14章和第20章学习有关各种解析(列表解析、集合解析和字典解析)的更多知识,因此,稍后再介绍更多细节。我们还将在第13章中介绍循环的时候,再次学习本节中用到的zip内置函数。

字典视图

在Python 3.0中,字典的keys、values和items都返回视图对象,而在Python 2.6中,它们返回实际的结果列表。视图对象是可迭代的,这就意味着对象每次产生一个结果项,而不是在内存中立即产生结果列表。除了是可迭代的,字典视图还保持了字典成分的最初的顺序,反映字典未来的修改,并且能够支持集合操作。另一方面,它们不是列表,并且不支持像索引和列表sort方法这样的操作,打印的时候它们也不显示自己的项。

我们将在第14章更正式地讨论可迭代的概念,但是,现在只要知道这一点就够了:如果想要应用列表操作或者显示它们的值,我们必须通过内置函数list来运行这3个方法的结果:

除非在交互提示模式显示结果,我们可能很少会注意到这一改变,因为Python中的循环结构会自动迫使可迭代的对象在每次迭代上产生一个结果:

此外,Python 3.0的字典自己仍然拥有迭代器,它返回连续键——就像在Python 2.6中一样,它往往仍然没有必要直接调用keys:

然而,和Python 2.X的列表结果不同,Python 3.0中的字典视图并非创建后不能改变——它们可以动态地反映在视图对象创建之后对字典做出的修改:

字典视图和几何

与Python 2.X中的列表结果不同,keys方法所返回的Python 3.0的视图对象类似于集合,并且支持交集和并集等常见的集合操作;value s视图不是这样的,因为它们不是唯一的;但items结果是的,如果(key,value)对是唯一的并且可散列的话。由于集合的行为很像是无值的字典(并且甚至像Python 3.0中的字典一样编写在花括号中),这是一种符合逻辑的对称。就像字典键一样,集合的项是无序的、唯一的并且不可变。

如下是键列表用于集合操作中的样子。在集合操作中,视图可能与其他的视图、集合和字典混合(在这种环境中,字典与它们的键视图一样对待):

如果字典项视图是可散列的话,它们是类似于集合的——也就是说,如果它们只包含不可变的对象的话:

要了解集合操作的更多内容,参阅第5章。现在,让我们看看Python 3.0中字典的另外3个快速编码注意事项。

排序字典键

首先,由于keys不会返回一个列表,在Python 2.X中通过排序键来浏览一个字典的编码模式,在Python 3.0中并不适用。必须要么手动地转换为一个列表,要么在一个键视图或字典自身上使用第4章及本章前面介绍的sorted调用:

字典大小比较不再有效

其次,尽管在Python 2.6中可以直接用<、>等比较字典的相对大小,但在Python 3.0中这不再有效。然而,可以通过手动地比较排序后的键列表来模拟:

Python 3.0中字典相等性测试仍然有效。由于我们将在下一章详细讨论比较的时候再次回顾这一点,我们将在那里介绍更多细节。

has_key方法已死:in永生

最后,广为使用的字典has_key键存在测试方法在Python 3.0中取消了。相反,使用in成员关系表达式,或者带有默认测试的一个get(其中,in通常是首选的):

如果你使用Python 2.6并且关心Python 3.0的兼容性,注意前两个改变(解析和视图)只能在Python 3.0中编码,但后3个(排序、手动比较和in)如今可以在Python 2.6中编写并且未来很容易迁移到Python 3.0中。

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

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

发布评论

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