《流畅的Python》读书笔记(三)

第三章 字典和集合

常见字典方法

字典派生自 collections.MutableMapping

  • 字典推导式
country_code = {
     country: code for code, country in DIAL_CODES}
  • setdefault
    字典的setdefault处理找不到的键,可以节省很多次键查询,
    – 让程序更高效
    – 可读性好
    – 可以连续操作
my_dict.setdefault(key, []).append(new_value)
  • 映射的弹性查询
    有时为了方便,找不到键时,也想返回一个默认值
  1. 使用 collections.defaultdict
>>> import collections
>>> index = collections.defaultdict(list)
>>> index['hunan'].append('changsha')
>>> index
defaultdict(<class 'list'>, {
     'hunan': ['changsha']})
  1. 自定义一个dict子类,子类中实现 __missing__方法
    dict[key] 会调用 __getitem__ 方法,如果没有找到,就会触发 __missing__方法
    k in d 会调用 __contains__ 方法,如果
    注意:要小心陷入无限循环调用

字典的变种

  • collections.OrderedDict
  • collections.ChainMap
  • collections.Counter
  • collections.UserDict子类化
  • 不可变映射类型
    让用户无法修改字典内容,可以使用types.MappingProxyType
>>> from types import MappingProxyType
>>> d = {
     1:'A'}
>>> d_proxy = MappingProxyType(d)
>>> d_proxy
mappingproxy({
     1: 'A'})
>>> d_proxy[1] = 'X'
Traceback (most recent call last):
  File "", line 1, in <module>
TypeError: 'mappingproxy' object does not support item assignment

集合论

set和frozenset直到 python2.3才首次出现,在python2.6中升级为内置类型

  • 集合可以用于去重
>>> l = ['spam', 'spam', 'eggs', 'spam']
>>> set(l)
{
     'spam', 'eggs'}
>>> list(set(l))
['spam', 'eggs']
  • 集合实现了很多中缀运算符
    两个集合 a, b
    a | b 返回合集
    a & b 返回交集
    a - b 返回差集
    a in b
    a < b
    a <= b
    等等 …
    合理使用这些操作,不仅有更好的可读性,还能减少程序运行时间
found = len(set(needles) & set(haystack))

以上例子,在含有 10000000个元素中搜索1000个值,大概只需要3毫秒左右。

  • 集合字面量
    {1}, {1,2}表示集合
    空集合必须写成 set()
    注意,{}表示的是空字典
    使用 {1, 2} 比 set([1, 2]) 构造集合效率更高
  • 集合推导式
    和字典推导式类似

字典、集和散列表

在有1000万个键的字典里查找1000个数,只需要 0.000337秒
使用集合的时间差不多
使用列表的速度最慢,需要100秒左右

  • 散列表
    散列表其实是一个稀疏数组。要把一个元素放入散列表需要先计算它的散列值。python使用 hash() 计算,hash()调用自定义的 __hash__方法。
  • 字典的实现及结果
    – 键必须是可散列的
    – 字典在内存上的开销巨大
    如果你的机器有几个GB,而对象是几百万个,空间优化工作可以等到真正需要的时候在开始。
    – 键查询速度很快
    – 键的次序取决于添加的顺序
    – 往字典里添加新键可能会改变已有键的顺序
    往字典中添加新内容,可以先遍历得出需要添加的内容,放到另外的字典里。迭代结束后再对原字典进行更新。
    .keys(), .items(), .values()方法返回的都是字典视图
  • 集合的实现及结果
    – 集合里面的元素必须是可散列的
    – 集合很消耗内存
    – 可以很高效判断元素是否存在于某个集合
    – 元素的次序取决于被添加到集合里的次序
    – 往集合里添加元素,可能会改变集合里已有元素的次序

1. 字典算得上是python的基石
2. python的特点是“简单而正确”
3. 由于拥有紧凑的列表和字典表达,JSON格式可以完美地用于数据交换

你可能感兴趣的:(读书笔记,《流程的python》,python)