python字典

        字典是另一种可变容器模型,切可存储任意类型对象。

        字典是Python中唯一的映射类型(哈希表)

        字段对象是可变的,但是字典的键必须使用 可变对象 ,一个字典中可以使用不同类型的键值。

        python内置了字典:dict的支持,dict全称dictonary,在其他语言中也成为map,使用键-值(key-value)存储,具有几块的查找速度。

        字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中,格式如下所示:

1
d = {key1 : value1,key2 : value2 }

        例:假设要根据人名查找对应的成绩,如果列表实现,需要两个列表

1
2
names = ['Michael', 'Bob', 'Tracy']
scores = [95, 75, 85]

        给定一个名字,要查找对应的成绩,就先要在names中找到对应的位置,再从scores取出对应的成绩,列表越长,耗时越长。

        如果使用字典,只需要一个“名字”-“成绩”的对照表,直接根据名字查找成绩,无论这个表有多大,查找速度都不会变慢

1
2
3
>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
>>> d['Michael']
95

        字典的实现原理和查字典是一样的,假设字典包含了一万个汉字,要查某一个字,一个办法就是把字典从第一页往后翻,直到找到想要的字为止,这种方法就是在列表中查找元素的方法,列表越大,查找越慢。

        第二种方法是先在字典的索引表里查这个字的对应页码,然后直接反倒该页,找到这个字,无论找到哪个字,这种查找速度都非常快,不会随着字典大小的增加而变慢。

        字典就是第二种实现方式,给定一个名字,比如Michael,字典在内部就可以直接计算出Michael对应存放成绩的“页码”,也就是95这个数字存放的内存地址,直接取出来,所以速度非常快。

        这种key-value存储方式,在放进去的时候,必须根据key算出value的存放位置,这样取的时候才能根据key直接拿到value。

        把数据放入字典的方法,除了初始化时指定外,还可以通过key放入

1
2
3
>>> d['Adam'] = 67
>>> d['Adam']
67

        由于一个key只能对应一个value,所以,多次对一个key放入value,后面的值会把前面的值冲掉

1
2
3
4
5
6
>>> d['Jack'] = 90
>>> d['Jack']
90
>>> d['Jack'] = 88
>>> d['Jack']
88

        如果key不存在,字典就会报错

1
2
3
4
>>> d['Thomas']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'Thomas'

        要避免key不存在的错误,有两种办法,一是通过in判断key是否存在

1
2
>>> 'Thomas' in d
False

        二是通过字典提供的get方法,如果key不存在,可以返回None,或者自己指定的value

1
2
3
>>> d.get('Thomas')
>>> d.get('Thomas', -1)
-1

        注意:返回None的时候python的交互式命令行不显示结果。

        要删除一个key,用pop(key)方法,对应的value也回从字典中删除

1
2
3
4
>>> d.pop('Bob')
75
>>> d
{'Michael': 95, 'Tracy': 85}

        请务必注意,字典内部存放的顺序和放入的顺序是没有关系的。

        和列表比较,字典有以下几个特点

  • 查找和插入的速度极快,不会随着key的增加而增加;
  • 需要占用大量的内存,内存浪费多。

        而列表相反

  • 查找和插入的时间随着元素的增加而增加;
  • 占用空间小,浪费内存很少。

        字典是用空间来换取时间的一种方法。

        字典可以用在需要高速查找的很多地方,在python代码中几乎无处不在,正确使用字典非常重要,需要牢记的一条就是字典的key必须是不可变对象

        这是因为字典根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那字典内部就完全混乱了。这个通过key计算位置的算法成为哈希算法(Hash)。

        要保证hash的正确性,作为key的对象就不能变。在python中,字符串、整数等都是不可变的,因此,可以放心作为key。而列表是可变的,就不能做为key

1
2
3
4
5
>>> key = [1, 2, 3]
>>> d[key] = 'a list'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

        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(),随机返回并删除字典中的一对键和值。