
5.2.3 字典和列表比较
假如给你一个任务,让你从一堆名字中查找某个名字,找到名字后再找到这个名字对应的序号,名字和序号是一一对应的,就如此时在字典屋的Python快乐学习班的全体同学都有一个唯一的序号。
根据目前所学,可以有两种实现方式:list列表和dict字典。
方式一:使用list列表实现。如果用list实现,需要定义两个列表,一个列表存放名字,一个列表存放序号,并且两个列表中的元素有一一对应关系。使用列表的方式,要先在名字列表中找到对应的名字,再从序号列表中取出对应的序号,使用列表的方式会发现,当list列表越长时,耗时也越长。
方式二:使用dict字典。如果用dict字典实现,只需要一个名字和序号一一对应的字典,就可以直接根据名字查找序号,无论字典有多大,查找速度都不会变。
为什么dict查找速度这么快?
因为在Python中,dict字典的实现原理和查字典类似,而list的实现原理则和标准的复读机类似,只能从左往右,一个不漏地读一遍。假设字典包含10000个汉字,要查某一个汉字时,一种方法是把字典从第一页往后翻,每一页从左到右,从上往下查找,直到找到想要的汉字为止,这种方式就是在list中查找元素的方式,所以当list越大时,查找会越慢。另一种方法是在字典的索引表里(如部首表)查这个汉字对应的页码,然后直接翻到该页找到这个汉字。用这种方式,无论找哪个汉字,查找速度都会非常快,不会随着字典大小的增加而变慢。
dict就是第二种实现方法,给定一个名字,比如要查找5.2.2节中,变量student中“小萌”的序号,在dict内部就可以直接计算出“小萌”存放序号的“页码”,也就是000存放的内存地址,直接取出来即可,所以速度非常快。
综上所述,list和dict各有以下几个特点。
字典dict的特点是:
(1)查找和插入的速度极快,不会随着字典中键的增加而变慢。
(2)字典需要占用大量内存,内存浪费多。
(3)字典中的元素是无序的,即不能通过索引下标的方式从字典中取元素。
列表list的特点是:
(1)查找和插入时间随着列表中元素的增加而增加。
(2)列表占用空间小,浪费内存很少。
(3)列表的元素是有序的,即可以通过索引下标从列表中取元素。
所以,字典dict可以理解为通过空间换取时间,而列表list则是通过时间换取空间的。
字典dict可以用在很多需要高速查找的地方,在Python代码中几乎无处不在,正确使用dict非常重要,需要牢记dict的键必须是不可变对象。
提示
dict内部存放的顺序和键放入的顺序没有关系。