古之立大事者,不惟有超世之才,亦必有坚忍不拔之志。

Python高级编程和异步I/O并发编程笔记 5 深入python的set和dict

Python admin 406℃ 0评论

dict的abc继承关系

python中的dict属于mapping类型,在collections中可以查找到“Mapping”和“MutableMapping(可修改的Mapping,继承自Mapping)”,准确的讲dict属于后者。

dict的常用方法

在pycharm中可以点击查看dict的源码,如上文所述,dict使用C语言编写,在pycharm中看到的dict的内部接口只是以代码的方式展示其文档。

dict的子类

在开发中是可以对python的内置数据结构(如列表list、字典dict)做继承的,但是不建议继承这些使用C语言实现的数据结构,原因在于继承后重载父类的方法在某些情况下可能不生效,如下例。上述问题的解决方法是使用python的collections模块中的UserDict,该类通过python模拟C语言将所有内部逻辑都实现了一遍,通过继承该类解决不生效的问题。

python内置的dict的子类:defaultdict,也是使用C语言实现的。其实现的方法原理是:在UserDict中的__getitem__方法有逻辑是如果查找不到key,则调用“__missing__”魔法函数,在该函数中会调用default_factory()[是一个property]给该key设置一个默认值。利用上述属性,defaultdict才有了如下使用:

set和frozenset

set即集合,frozenset即不可变集合。set作为一种无序集合,最大的特点是“不重复”,所以主要用于去重、判断是否包含。frozenset因为其不可变且不重复,所以可以作为dict的key。集合操作和数学运算相关,常见的有求集合的差集、交集等等,同时由于python的set和dict都是使用C语言实现的,且都使用了hash的实现原理,性能非常高,做查找运算的时间复杂度为O(1)。

dict和set的实现原理

  • dict的key或者set的值,都必须是可以hash的。不可变对象都是可hash的, str, fronzenset, tuple,自定义的hash类(实现__hash__
  • dict的内存花销大,但是查询速度快, 自定义的对象 或者python内部的对象都是用dict包装的
  • dict的存储顺序和元素添加顺序有关
  • 添加数据有可能改变已有数据的顺序

转载请注明:北凉柿子 » Python高级编程和异步I/O并发编程笔记 5 深入python的set和dict

喜欢 (1)or分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址