字典是另一种可变容器模型,切可存储任意类型对象。
字典是Python中唯一的映射类型(哈希表)
字段对象是可变的,但是字典的键必须使用 可变对象
,一个字典中可以使用不同类型的键值。
python内置了字典:dict的支持,dict全称dictonary,在其他语言中也成为map,使用键-值(key-value)存储,具有几块的查找速度。
字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中,格式如下所示:
|
|
例:假设要根据人名查找对应的成绩,如果列表实现,需要两个列表
|
|
给定一个名字,要查找对应的成绩,就先要在names中找到对应的位置,再从scores取出对应的成绩,列表越长,耗时越长。
如果使用字典,只需要一个“名字”-“成绩”的对照表,直接根据名字查找成绩,无论这个表有多大,查找速度都不会变慢
|
|
字典的实现原理和查字典是一样的,假设字典包含了一万个汉字,要查某一个字,一个办法就是把字典从第一页往后翻,直到找到想要的字为止,这种方法就是在列表中查找元素的方法,列表越大,查找越慢。
第二种方法是先在字典的索引表里查这个字的对应页码,然后直接反倒该页,找到这个字,无论找到哪个字,这种查找速度都非常快,不会随着字典大小的增加而变慢。
字典就是第二种实现方式,给定一个名字,比如Michael
,字典在内部就可以直接计算出Michael
对应存放成绩的“页码”,也就是95
这个数字存放的内存地址,直接取出来,所以速度非常快。
这种key-value存储方式,在放进去的时候,必须根据key算出value的存放位置,这样取的时候才能根据key直接拿到value。
把数据放入字典的方法,除了初始化时指定外,还可以通过key放入
|
|
由于一个key只能对应一个value,所以,多次对一个key放入value,后面的值会把前面的值冲掉
|
|
如果key不存在,字典就会报错
|
|
要避免key不存在的错误,有两种办法,一是通过in
判断key是否存在
|
|
二是通过字典提供的get方法,如果key不存在,可以返回None,或者自己指定的value
|
|
注意:返回None的时候python的交互式命令行不显示结果。
要删除一个key,用pop(key)
方法,对应的value也回从字典中删除
|
|
请务必注意,字典内部存放的顺序和放入的顺序是没有关系的。
和列表比较,字典有以下几个特点
- 查找和插入的速度极快,不会随着key的增加而增加;
- 需要占用大量的内存,内存浪费多。
而列表相反
- 查找和插入的时间随着元素的增加而增加;
- 占用空间小,浪费内存很少。
字典是用空间来换取时间的一种方法。
字典可以用在需要高速查找的很多地方,在python代码中几乎无处不在,正确使用字典非常重要,需要牢记的一条就是字典的key必须是不可变对象
。
这是因为字典根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那字典内部就完全混乱了。这个通过key计算位置的算法成为哈希算法(Hash)。
要保证hash的正确性,作为key的对象就不能变。在python中,字符串、整数等都是不可变的,因此,可以放心作为key。而列表是可变的,就不能做为key
|
|
Python 字典包含了以下内置函数:
序号 | 函数及描述 |
---|---|
1 | cmp(dict1, dict2),较两个字典元素 |
2 | len(dict),计算字典元素个数,既键的总和。 |
3 | str(dict),输出字典可打印的字符串表示。 |
4 | type(variable),返回输入的变量类型,如果变量是字典就返回字典类型。 |
Python 字典包含了以下内置方法:
序号 | 函数及描述 |
---|---|
1 | dict.clear(),删除字典内所有元素 |
2 | dict.copy(),返回一个字典的浅复制 |
3 | dict.fromkeys(seq[, val])),创建一个新字典,以序列 seq 中元素做字典的键,val 为字典所有键对应的初始值 |
4 | dict.get(key, default=None),返回指定键的值,如果值不在字典中返回default值 |
5 | dict.has_key(key),如果键在字典dict里返回true,否则返回false |
6 | dict.items(),以列表返回可遍历的(键, 值) 元组数组 |
7 | dict.keys(),以列表返回一个字典所有的键 |
8 | dict.setdefault(key, default=None),和get()类似, 但如果键不存在于字典中,将会添加键并将值设为default |
9 | dict.update(dict2),把字典dict2的键/值对更新到dict里 |
10 | dict.values(),以列表返回字典中的所有值 |
11 | pop(key[,default]),删除字典给定键 key 所对应的值,返回值为被删除的值。key值必须给出。 否则,返回default值。 |
12 | popitem(),随机返回并删除字典中的一对键和值。 |