任何运行的Python程序,同时活跃着许多字典,即使用户的程序代码,没有明确使用字典。
— A. M. Kuchling
漂亮的代码,第18章,Python的字典的实现
字典dict类型不仅广泛应用于我们的程序,也是Python实现的一个基本组成部分。模块命名空间、类和实例的属性和函数的关键字参数的一些基本结构是字典使用的地方。dict内置的功能位于__builtins__ .__dict__
。
由于其关键作用,Python的字典高度优化。哈希表是在Python字典后的高性能的发动机。
我们在本章中还包括集合sets是因为它们也是哈希表实现的。了解一个哈希表的工作方式是如何使用大多数字典和集合
这里是本章的简要概述: 通用词典的方法 丢失键的特殊处理 dict在标准库的变化 集合和冻结集类型 哈希表如何工作 哈希表的影响:关键类型的限制,不可预知的顺序等
##泛型类型的映射 collections.abc模块提供Mapping和MutableMapping ABCs格式化字典的接口和类似的类型。见图3.1 专门的映射的实现往往扩展dict或collections.UserDict,而不是这些ABCs。ABCs的价值主要在于记录和正规化最小接口的映射,并为isinstance在代码中测试需要支持映射在一个广义的场景中提供标准。
>>> my_dict = {}
>>> isinstance(my_dict, abc.Mapping)
True
使用insinstace比确定一个方法的参数是否是dict类型更好,因为接着一个可供替代的映射类型就可以使用了。
标准库里所有的映射类型在其实现中使用了基本的dict,因此限制所有的键必须是哈希化的。
给定了这些基本规则,你可以通过几种方法构建字典。库参考中的内建方法页面有不同方法构造字典的示例:
>>> a = dict(one=1, two=2, three=3)
>>> b = {'one': 1, 'two': 2, 'three': 3}
>>> c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))
>>> d = dict([('two', 2), ('one', 1), ('three', 3)])
>>> e = dict({'three': 3, 'one': 1, 'two': 2})
>>>a==b==c==d==e
True
除了字面的语法形式和复杂的dict构造函数,我们可以使用字典推导式来构建字典。见下一小节。
##字典推导式
自从Python 2.7列表推导式和生成器表达式的语法被应用在字典推导式(集合推导式也是一样的,我们将很快谈到)。一个字典推导式通过从任何一个迭代对象中生成键:值对来构造一个字典实例。 例3-1.字典推导式例子
>>> DIAL_CODES = [
... (86, 'China'),
... (91, 'India'),
... (1, 'United States'),
... (62, 'Indonesia'),
... (55, 'Brazil'),
... (92, 'Pakistan'),
... (880, 'Bangladesh'),
... (234, 'Nigeria'),
... (7, 'Russia'),
... (81, 'Japan'),
... ]
>>> country_code = {country: code for code, country in DIAL_CODES}
>>> country_code
{'China': 86, 'India': 91, 'Bangladesh': 880, 'United States': 1, 'Pakistan': 92, 'Japan': 81, 'Russia': 7, 'Brazil': 55, 'Nigeria': 234, 'Indonesia': 62}
>>> {code: country.upper() for country, code in country_code.items() ... if code < 66}
{1: 'UNITED STATES', 55: 'BRAZIL', 62: 'INDONESIA', 7: 'RUSSIA'}
如果你习惯liscomps,dictcomps是顺理成章。如果不是,listcomp语法的传播意味着熟悉它现在比以往任何时候都更有利可图。
我们现在转去看看mapping的API的全貌 ##公共mapping方法的总览 映射方法的基本的API是非常丰富的,表3-1显示了这些方法通过字典和它的两个最有用的变化来实现:defaultdict和OrderedDict,defaultdict和OrderedDict都定义在集合模块。
```方法
```撒上