美文网首页
2018-10-31 031 字典进阶 A

2018-10-31 031 字典进阶 A

作者: 杜若飞er | 来源:发表于2018-10-31 18:27 被阅读2次

字典这个数据结构活跃在所有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的优越性就表现出来了。

相关文章

网友评论

      本文标题:2018-10-31 031 字典进阶 A

      本文链接:https://www.haomeiwen.com/subject/pmzatqtx.html