通过之前的内容,我们了解到,列表这种结构适合于将值组织到一个结构中,并通过编号对其进行引用。但是我们有时候会需要一种更便捷明了的方式存取、一种以名字来操作引用值的数据结构,这种类型的数据结构称为映射。字典是python中(本人唯一已知)的映射类型。
字典的使用
字典这个名称已经给出了其很多的信息,其构造方式是以通过某个特定的词语(键),从而找到他的意义(值)。
某些情况下用字典会比使用列表让程序结构更加清晰明了。比如:游戏棋盘了、存储文件修改时间了、数字电话了、地址薄了、学生成绩单了。。。
创建和使用字典
字典可以通过如下方式创建:
>>> testdict = { "test_key1":"test_value1",test_key2":"test_value2"}
字典有多个键及其对应的值组成,键值对之间以","分割,键是唯一的,值可以重复
dict函数
可以通过dict函数,将(键值)对的序列建立字典,也可以通过关键字创建字典。
>>> items = [("name","jams"),("age",25)]>>> test = dict(items)>>> test{ 'name': 'jams', 'age': 25} >>> d = dict(name = 'Gumbi',age = 23) >>> d {'name': 'Gumbi', 'age': 23}
基本字典操作
字典基本行为:
-
- len(d)返回d的项的数量;
- d[k]返回关联到键k上的值
- d[k] = v将v值关联到k键上
- del d[k]删除键为k的项
- k in d 检查d中是否含有键为k的项
键类型:字典的键不一定为整型数据,可以使任意不可变类型,如浮点型、字符串、元组等。
自动添加:键在字典中不存在时,也可为它赋值,这样的操作,会将该键值对插入字典中,完成添加操作
成员资格:表达式k in d查找的是键而不是值,这与列表、元组、字符串等有区别。其优势也会更加明显,在字典中查看成员资格比列表中的更高效,数据结构规模越大,效率反差越大。
>>> a = {("name","jams"):{ 'age':23,'add':'dongsanqi'}}>>> a['testK'] = 'testV'>>> a{ 'testK': 'testV', ('name', 'jams'): { 'add': 'dongsanqi', 'age': 23}}>>> 'testK' in aTrue>>> del a['testK']>>> a{('name', 'jams'): { 'add': 'dongsanqi', 'age': 23}}>>> len(a)1
字典的格式化字符串
之前字符串格式化中提到过可以用元组来格式化字符串,其实字典也是可以操作的。只是转换说明符要变化一下。话不多说,看代码先。
>>> phonebook = { 'king':'1123','joker':'1124','lucy':'1125'}>>> 'king\'s phone number is %(king)s'%phonebook"king's phone number is 1123"
字典方法
就像其他内建类型一样,字典也有方法。可能不会像雷暴或字符串方法那么频繁使用,但也是灰常有用哒。
clear
clear用于清除字典中的所有项,这个方法为原地操作,无返回值,操作结束后,字典为空字典。
>>> test_dict = { 1:'enheng','name':'biubiu','age':34}>>> test_dict.clear()>>> test_dict{}
copy
同列表一样,是个浅拷贝,如果想要避免其带来的负面影响,可以使用深拷贝即deep copy
>>> x = {'name':'admin','val':['foo','bar','baz']}
>>> y = x.copy()>>> y['name']='fukuda'>>> y['val'].append('test')>>> y{'val': ['foo', 'bar', 'baz', 'test'], 'name': 'fukuda'}>>> x{'val': ['foo', 'bar', 'baz', 'test'], 'name': 'admin'}>>> from copy import deepcopy>>> z = deepcopy(x)>>> x['name'] = 'jing'>>> x['val'].remove('foo')>>> x{'val': ['bar', 'baz', 'test'], 'name': 'jing'}>>> y{'val': ['bar', 'baz', 'test'], 'name': 'fukuda'}>>> z{'val': ['foo', 'bar', 'baz', 'test'], 'name': 'admin'}fromkeys
fromkeys使用给定的键建立新的字典,每个键都对应一个默认的值None。此外你还可以直接在dict上面调用该方法,如果不想使用None作为默认值,可以自己提供默认值。
>>> {}.fromkeys('name','age','add')
Traceback (most recent call last): File "<stdin>", line 1, in <module>TypeError: fromkeys expected at most 2 arguments, got 3>>> {}.fromkeys(['name','age','add']){'add': None, 'age': None, 'name': None}>>> dict.fromkeys(['name','age','add']){'add': None, 'age': None, 'name': None}>>> dict.fromkeys(['name','age','add'],'unknown'){'add': 'unknown', 'age': 'unknown', 'name': 'unknown'}get
get是个体面的方法,一般来说,如果你试图直接用d[k]方式访问字典中的不存在的项,会报错,这就尴尬了,而get就不会。他会返回一个None,它还可以指定默认值,这样就会提高程序的容错率。
>>> d = {}>>> print(d['name'])Traceback (most recent call last): File "", line 1, in KeyError: 'name'>>> print(d.get('name'))None>>> print(d.get('name','doubi'))doubi
pop
pop方法用来获得对应给定键的值,然后将这个键值对从字典中移除
>>> d = { 'x':1,'y':2}>>> d.pop('x')1>>> d{ 'y': 2}
setdefault
setdefault某种意义上与get类似,能够获得与给定键相关联的值,除此之外,它还是get的升级,如果该值不存在,则会设定相应的键值。如果键值存在,就不会改变字典,默认值可选。如果不设定,会默认使用None。
>>> d = {}>>> d.setdefault('name','king')'king'>>> d{ 'name': 'king'}>>> d.setdefault('name','fukuda')'king'>>> d{ 'name': 'king'}>>> d.setdefault('age')>>> d{ 'age': None, 'name': 'king'}
update
update方法可以利用一个字典项更新另一个字典,提供的字典中的项会被添加到旧的字典中,若有相同的键,则会覆盖。
>>> d{ 'age': None, 'name': 'king'}>>> d = { 'name':'king','age':23,'add':'dongsanqi'}>>> du = { 'name':'king','age':24,'phone':'1134'}>>> d.update(du)>>> du{ 'age': 24, 'name': 'king', 'phone': '1134'}>>> d{ 'age': 24, 'phone': '1134', 'name': 'king', 'add': 'dongsanqi'}