dicti类型在各种程序中得到广泛应用,模块的命名空间、实例的属性和函数的关键字参数中都可以看到字段的身影。跟它有关的内置函数都在__builtins__.__dict__模块中。
Python对dict的实现做了高度优化,而散列表是字典类型性能出众的根本原因。集合(set)的实现其实也依赖于散列表。想要进一步理解集合和字典,就得先理解散列表的原理。
3.1 泛映射类型
collections.abc模块中有Mapping和MutableMapping这两个抽象基类,它们的作用为了dict和其他类似的类型定义形式接口。这些基类主要是作为形式化的文档,定义了构建一个映射类型所需要的最基本的接口。
3.2 字典推导
#字典推导应用
>>> DIAL_CODES = [
(91, 'India'),
(1, 'United States'),
(62, 'Indonesia'),
(7, 'Russia'),
(81, 'Japan'),
]
>>> country_code = {country: code for code, country in DIAL_CODES}
>>> country_code
{'India': 91, 'United States': 1, 'Indonesia': 62, 'Russia': 7, 'Japan': 81}
>>> {code: country.upper() for country, code in country_code.items() if code < 66}
{1: 'UNITED STATES', 62: 'INDONESIA', 7: 'RUSSIA'}
3.3 常见的映射方法
常见的映射方法,这里就不一一列出。
用setdefault处理找不到的键
3.4 映射的弹性键查询
如果某个键在映射里不存在,可以通过以下两种方式通过这个键读取得到一个默认值。
- 一个是通过defaultdict这个类型而不是普通的dict。
- 另一个是给自己定义一个dict的子类,并在子类实现__missing__方法。
3.5 字段的变种
省略
3.6 子类化UserDict
省略
3.7 不可变映射类型
省略
3.8 集合论
集合的本质是许多唯一对象的聚集。因此,可以去重。它的特点就是以空间换时间,耗内存,易查询,使用频率低。这些特点归功于它背后的散列表。
>>> l = ['spam','spam','eggs','spam']
>>> l
['spam', 'spam', 'eggs', 'spam']
>>> set(l)
{'spam', 'eggs'}
>>> list(set(l))
['spam', 'eggs']
注意:如果要创建一个空集,需使用不带参数的set()方法。如果只是写成{}的形式,那创建的是个空字典。
集合推导
>>> from unicodedata import name
>>> {chr(i) for i in range(32,256) if 'SIGN' in name(chr(i),'')}
{'®', '§', '°', '©', '±', '¢', '%', '+', '¬', '¶', '>', '¤', 'µ', '×', '£', '¥', '<', '#', '÷', '$', '='}
集合的操作:
(1)数学运算
Python
|
方法
|
描述
|
s & z
|
s.__and__(z)
| s和z的交集 |
s | z
|
s.__or__(z)
|
s和z的并集
|
s - z
|
s.__sub__(z)
|
s和z的差集
|
s ^ z
|
s.__xor__(z)
|
s和z的对称差集
|
(2)比较运算
Python运算符
|
方法
|
描述
|
e in s
|
s.__contains__(e)
|
元素e是否属于s
|
s <= z
|
s.__le__(z)
|
s是否为z的子集
|
s < z
|
s.__lt__(z)
|
s是否为z的真子集
|
s >= z
|
s.__ge__(z)
|
s是否为z的父集
|
s > z
|
s.__gt__(z)
|
s是否为z的真父集
|
(3)其他方法
方法
|
set
|
frozenset
|
描述
|
s.add(e)
|
*
|
|
把元素e添加到s中
|
s.clear()
|
*
|
|
移除掉s中的所有元素
|
s.copy()
|
*
|
*
|
对s浅复制
|
s.discard(e)
|
*
|
|
如果s里有e这个元素的话,把它移除
|
s.__iter__()
|
*
|
*
|
返回s的迭代器
|
s.__len__()
|
*
|
*
|
len(s)
|
s.pop()
|
*
|
|
从s中移除一个元素并返回它的值,若s为空,则抛出KeyError异常
|
s.remove(e)
|
*
|
|
从s中移除e元素,若e元素不存在,则抛出KeyError异常
|
3.9 dict和set的背后
Python用散列表实现dict和set的,具体如何实现这里就不一一展开。
特点:
- 键必须是可散列的
- 内存开销大
- 键查询很快
- 键的次序取决于添加顺序
- 新增会改变原有的顺序
3.10 本章小结