博客摘要
解答高频面试题:字典为什么查询速度O(1)?3.6前后字典顺序差异。同时汇总4种高效遍历方式,解决遍历中删除key报错问题。
一、底层哈希表原理
Python字典底层采用开放寻址法哈希表,存储结构分为哈希表索引、key、value三部分:
存入key:通过hash()函数计算key哈希值,取余得到数组下标,存入对应位置
查询key:直接计算哈希值定位下标,无需逐个遍历,时间复杂度稳定O(1)
哈希冲突:开放寻址法向后寻找空位,避免数据覆盖
版本差异:Python3.6底层数组存储,默认插入有序;3.5及以前无序,不要依赖低版本字典顺序。
二、增删改查标准写法
增:d["key"]=value、d.setdefault()(不存在新增,存在不修改,避免覆盖)
改:直接赋值d["key"]=新值,key存在即修改
查:[]取值(不存在报错)、get()取值(不存在返回None,生产首选)
删:pop指定key删除、popitem尾部删除、clear清空、del全局删除
三、四大遍历技巧与避坑
遍历key:for k in d.keys()
遍历value:for v in d.values()
遍历键值对(最常用):for k,v in d.items()
高危避坑:禁止遍历字典同时增删key,会触发迭代器异常,解决方案:遍历列表副本