字典与list的故事
dict可谓是Python中最重要的数据结构之一,相比list查找元素,在dict中可以直接(相对list线性查找来说)通过元素hash直接就可以获取到目标元素返回, 拿出此之外还有哪些好玩的呢,让我们一起探索
都在说的hash表
提到dict大家都会提到hash表, 提到hash表就会提到两种实现方式开放地址法就是申请一个大段的数组空间,然后通过hash取模计算出元素所在的位置,同时如果发现给定位置元素已经存在就继续探测,直到找到可用位置为止,同时当空间生于超过一定比例之后,重新进行扩容
链表法将元素通过hash取模之后,将元素作为一个元素挂到指定位置后面的链表里面,后续查找的时候,通过线性的二次比对值就可以定位到元素了
Python选用的是开放地址法, 相比开放地址法,链表在每次添加元素的时候,都要新分配一个链表节点,但是可以减少冲散裂带来的冲突,但是同样,如果hash算法不够好,则容易导致退化成线形查找,主要是现在各种资源够用,就相当于拿空间去换时间了
变得有序
在Python2的时候,我们添加元素的时候,字典并不能保证在后续迭代的时候,能按照添加的顺序来迭代,所以那个时候我们还需要使用OrderDict,而如今已大大不同
字典视图
Python2中我们调用keys、values、items都是直接返回一个list对象,而Python3中则返回的是一个视图对象, 这个视图对象有个很重要的特性就是可迭代, 不必一下在内存中产生全部的结果列表,可以逐个迭代
视图对象除了可迭代外,视图对象本身其实持有的是dict元素对象的一个引用,可以实时反应dict元素的数据
还有个小tips: keys()和items()返回的视图对象包含集合操作,而values()不是, 其实很容易就想明白呀, values可能会有重复嘛,哈哈
不见了的has_key
在Python2中,我们还常使用has_key来进行一个字典是否包含某个key的检查,但在python3厘米,已经没了,大家可以用in 来更pythonic
不负如来不负卿
好了一张内容全览,其中修改和读取操作,为分别用了两种颜色去标识两类操作,你有猜到么,欢迎各位pythoner兄弟指指点点, 希望结实更多的Pythoner
领取专属 10元无门槛券
私享最新 技术干货