流畅的Python - 第3章-字典和集合
Contents
标准库中的所有映射类型都是利用dict来实现的,因此它们有个共同的限制–只有可散列的数据类型才能用作这些映射里的键(只有键key有这个要求,值value不需要是散列形式)。
可散列类型:如果一个对象是可散列的,那么在这个对象的生命周期中,它的散列值是不变的,而且这个对象需要实现 __hash__()
方法。如果需要和其他的对象对比的话,还需要实现 __eq__()
方法。
字典类型(dict)
初始化操作:
当在字典中取不存在的值时,会抛出异常,为了避免抛出异常的情况,如果是自定义的字典类型,可以选择在类中添加 __missing__
方法。
原理是字典在寻找对应key的value时,会先调用 __getitem__
方法,如果为找到对应的key,则会尝试调用 __missing__
方法。
当然不太推荐自己再造一个dict类型的轮子,面对key不在键中的情况,好的方法有下面几种:
dict_a.get(key, default_value)
- 通过get方法时指定当key不存在时返回的value。dict_a.setdefault(key, default_value)
- 和get方法一样。collections.defaultdict(value_type)
- 使用 collections.defaultdict 对象代替传统的dict对象。
字典总结
- 字典中的 键必须是可散列的
- 字典在内存上的开销巨大
- 键查询很快
- 键的次序取决于添加的顺序
- 往字典中添加新键可能会改变已有键的顺序
集合(set)
集合表示在集合中的 元素只有唯一的一个。
集合的生成式和字典的类似,不过其中的参数为一个。
集合也有类似于 列表list 的性质,但比列表多了很多集合本身的数学性质。
集合总结
- 集合的 元素必须是可散列的
- 集合在内存上的开销巨大
- 集合内元素的查询很快
- 集合内元素的次序已经排列好
- 往集合中添加新元素可能会改变已有元素的顺序