PEP 274 – 字典推导式
- 作者:
- Barry Warsaw <barry at python.org>
- 状态:
- 最终
- 类型:
- 标准跟踪
- 创建:
- 2001年10月25日
- Python 版本:
- 2.7, 3.0
- 历史记录:
- 2001年10月29日
摘要
PEP 202 引入了一种名为“列表推导式”的 Python 语法扩展。本 PEP 提议了一种类似的语法扩展,称为“字典推导式”或简称“字典推导”。您可以以与列表推导式非常相似的方式使用字典推导式,只是它们生成的是 Python 字典对象而不是列表对象。
决议
本 PEP 最初是为包含在 Python 2.3 中而编写的。在观察到其大部分好处都被生成器表达式与 dict()
构造函数结合使用所取代后,它被撤回了。
但是,Python 2.7 和 3.0 引入了这个确切的功能,以及紧密相关的集合推导式。2012年4月9日,PEP 被修改以反映这一现实,方法是将其状态更新为“已接受”,并更新 Python 版本字段。 “未解决的问题”部分也被删除,因为这些问题早已通过当前的实现得到解决。
提议的解决方案
字典推导式就像列表推导式一样,只不过您使用花括号而不是方括号来分组表达式。此外,for
关键字之前的左侧部分表达了一个键和一个值,用冒号分隔。该表示法专门设计为让您想起应用于字典的列表推导式。
基本原理
有时,您会有一些数据以长度为 2 的序列的形式排列,并且您希望将其转换为字典。在 Python 2.2 中,dict()
构造函数接受一个参数,该参数是长度为 2 的序列,用作 (键,值) 对来初始化一个新的字典对象。
但是,将某些数据转换为长度为 2 的序列的行为从内存或性能的角度来看可能不方便或效率低下。此外,对于某些常见操作,例如将事物的列表转换为事物的集合以快速删除重复项或进行集合包含测试,更好的语法可以帮助提高代码清晰度。
与列表推导式一样,始终可以使用显式的 for 循环(实际上,在早期版本的 Python 中,这是唯一的方法)。但是,与列表推导式一样,字典推导式可以提供比传统 for 循环更简洁的语法习惯用法。
语义
字典推导式的语义实际上可以在现有的 Python 2.2 中通过将列表推导式传递给内置的字典构造函数来演示
>>> dict([(i, chr(65+i)) for i in range(4)])
在语义上等效于
>>> {i : chr(65+i) for i in range(4)}
但是,字典构造函数方法与提议的语法相比有两个明显的缺点。首先,它不如字典推导式易读。其次,它迫使程序员首先创建一个内存中的列表对象,这可能代价很高。
示例
>>> print {i : chr(65+i) for i in range(4)}
{0 : 'A', 1 : 'B', 2 : 'C', 3 : 'D'}
>>> print {k : v for k, v in someDict.iteritems()} == someDict.copy()
1
>>> print {x.lower() : 1 for x in list_of_email_addrs}
{'barry@zope.com' : 1, 'barry@python.org' : 1, 'guido@python.org' : 1}
>>> def invert(d):
... return {v : k for k, v in d.iteritems()}
...
>>> d = {0 : 'A', 1 : 'B', 2 : 'C', 3 : 'D'}
>>> print invert(d)
{'A' : 0, 'B' : 1, 'C' : 2, 'D' : 3}
>>> {(k, v): k+v for k in range(4) for v in range(4)}
... {(3, 3): 6, (3, 2): 5, (3, 1): 4, (0, 1): 1, (2, 1): 3,
(0, 2): 2, (3, 0): 3, (0, 3): 3, (1, 1): 2, (1, 0): 1,
(0, 0): 0, (1, 2): 3, (2, 0): 2, (1, 3): 4, (2, 2): 4, (
2, 3): 5}
实现
所有实现细节都在 Python 2.7 和 3.0 的时间范围内得到解决。
版权
本文档已置于公共领域。
来源:https://github.com/python/peps/blob/main/peps/pep-0274.rst
上次修改时间:2023年9月9日 17:39:29 GMT