字典这个数据结构活跃在所有Python程序的背后,即便你的源码里并没有直接用到它。
——A.M.Kuchling
字典是一种性能极其优秀的数据结构(当然我们已经测试过貌似比元组还是差一点点),这来自于字典基于散列表 ,事实上,集合set的本质上也使用了散列表,在写完了字典后就写一下。学过数据结构的读者可能对散列表并不陌生,如果你确实不知道,请看看016期写集合的注视,没错,散列表和哈希表就是一回事。
字典推导dictcomp
自从Python2.7之后,列表推导就泛化到了字典上,作为一种高效的拉字典的方式,这种方式可以从任何以键值对作为元素的可迭代对象中构建出字典。这句话可能很难理解,我们不妨直接看看咋用的:
List_stu = [
(1,'drf'),
(2,'lza'),
(3,'zsj')
]
id_stu = {
id: stu for stu, id in List_stu
}
print(id_stu)
print(id_stu['drf'])
结果如下:
{'drf': 1, 'lza': 2, 'zsj': 3}
1
这里先拉出来一个承载数据对的列表,然后反制了一下配对好的数据,构成字典id_stu,如果大家理解了列表推导,那么字典的推导也就很容易了。
值得注意的是,为了保持元素的对应关系,我们用来推导的那个列表应该像示例一样是可以结成对子的,否则,字典就会有崩溃的可能。
setdefault
dict.setdefault(k,[default])
是一种在dict和它的衍生数据类型defaultdict、OrderedDict都可以利用的高效的方法,用语言来描述这个方法就是:检查字典里有无键值k,若存在就把它对应的value设置为default并返回,若没有,就执行dict[k]=default
,并返回default
之所以说这个方法很重要,是因为我们虽然并不经常使用它,但在使用时,确实可以节省很多次键查询,而且,处理找不到的键,一直是字典中一个很重要的工作,而setdefalut无论是用法还是逻辑,都比较符合我们对这项工作的要求。
这来源于Python在设计之初就存在的一个“快速失败”的逻辑,在发现一个可能造成问题的地方,二话不说就抛出异常终止程序,防止程序员不处理它而造成更大的麻烦,这种哲学虽然很精巧吗,但确实在使用时给Coder造成了一些困难,比如访问到不存在的键值——这其实是一个很小的错误,而且绝大部分时候都并不是故意的,很多时候甚至是拼写错误,所以,绝大部分Pythoner都知道用dict.get(k,default)
来代替简单的键值访问,以防止因为非常非常低级的错误导致一个大大的异常,但是很多时候,这样的方法并不高效,而且有可能会造成问题,这时候setdefault的优越性就表现出来了。
网友评论