标准库中的所有映射类型都是利用dict来实现的,因此它们有个共同的限制–只有可散列的数据类型才能用作这些映射里的键(只有键key有这个要求,值value不需要是散列形式)

可散列类型:如果一个对象是可散列的,那么在这个对象的生命周期中,它的散列值是不变的,而且这个对象需要实现 __hash__() 方法。如果需要和其他的对象对比的话,还需要实现 __eq__() 方法。

字典类型(dict)

初始化操作:

3_dict_init

当在字典中取不存在的值时,会抛出异常,为了避免抛出异常的情况,如果是自定义的字典类型,可以选择在类中添加 __missing__ 方法。

3_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对象。

3_dict_setdefault

字典总结

  • 字典中的 键必须是可散列的
  • 字典在内存上的开销巨大
  • 键查询很快
  • 键的次序取决于添加的顺序
  • 往字典中添加新键可能会改变已有键的顺序

集合(set)

集合表示在集合中的 元素只有唯一的一个

集合的生成式和字典的类似,不过其中的参数为一个。

3_dict_set3_set_genertordefault

集合也有类似于 列表list 的性质,但比列表多了很多集合本身的数学性质。

3_set_operate

集合总结

  • 集合的 元素必须是可散列的
  • 集合在内存上的开销巨大
  • 集合内元素的查询很快
  • 集合内元素的次序已经排列好
  • 往集合中添加新元素可能会改变已有元素的顺序