Following system colour scheme - Python 增强提案 Selected dark colour scheme - Python 增强提案 Selected light colour scheme - Python 增强提案

Python 增强提案

PEP 274 – 字典推导式

作者:
Barry Warsaw <barry at python.org>
状态:
最终版
类型:
标准跟踪
创建日期:
2001年10月25日
Python 版本:
2.7, 3.0
发布历史:
2001年10月29日

目录

摘要

PEP 202 引入了 Python 的语法扩展,称为“列表推导式”。本 PEP 提出了一种类似的语法扩展,称为“字典推导式”或简称“dict 推导式”。你可以用与列表推导式非常相似的方式使用字典推导式,不同之处在于它们生成 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

最后修改时间: 2025-02-01 08:59:27 GMT