4.1 字典的使用
字典:通过名字来引用值的数据结构,又称为映射
字典中的值并没有特殊的顺序,但是都存储在一个特定的键下
字典提供的功能:快速查找特定键值对应关系
某些情况下,字典比列表更好用一些,比如:
1.标识一个游戏期盼的状态,每个键都是由坐标值组成的元组
2.存储文件修改时间,用文件名作为键
3.数字电话、地址簿
问题:为什么用字符串而不用整数来表示电话号码?
为了防止产生误识别
4.2 创建和使用字典
phonebook = {‘Alice‘:1567,‘Beth‘:‘3657‘,‘Cecil‘:0010}
字典有多个键-值对构成,空字典由两个大括号构成,如{}
注意:字典中的键是唯一的,值不唯一
4.2.1 dict函数
可以使用dict函数,通过其他映射(比如字典)或者(键,值)对的序列建立字典
items = [(‘name‘,‘Gumby‘),(‘age‘,43)] d = dict(items) >>> print d {‘age‘: 43, ‘name‘: ‘Gumby‘}
4.2.2 字典的基本操作
len(d) :返回d总的键值对数量
d[k] :返回关联到键k上的值
d[k]=v :将值v关联到键k上
del d[k]:删除键为k的项
k in d :检查d中是否含有键为k的项
键类型:不一定是整型,可以是任意的不可变类型,如浮点型(实型)、字符串或者元组
4.2.3 字典的格式化字符串
phonebook = {‘Alice‘:1567,‘Beth‘:‘3657‘,‘Cecil‘:0010} >>> "Cecil‘s phone number is %(Cecil)s." % phonebook "Cecil‘s phone number is 8."
4.2.4 字典方法
1.clear:清除字典中的所有项
这个操作没有返回值
2.copy:返回一个具有相同键值对的新字典
这一种复制是浅复制
浅复制:
x = {‘username‘:‘admin‘,‘machine‘:[‘foo‘,‘bar‘,‘baz‘]} y = x.copy() y[‘username‘] = ‘mlh‘ y[‘machine‘].remove(‘bar‘) print y print x #结果如下 {‘username‘: ‘mlh‘, ‘machine‘: [‘foo‘, ‘baz‘]} {‘username‘: ‘admin‘, ‘machine‘: [‘foo‘, ‘baz‘]}
可以看到,当在副本中替换值的时候,原始字典不受影响,但是如果修改了某个字,原始字典也会发生变化,因为同样的也存储在原字典中,避免浅复制的一种方法就是使用深复制,复制其包含的所有值,可以使用copy模块的deepcopy来实现
深度复制:
from copy import deepcopy d = {} d[‘names‘] = [‘Alfed‘,‘Bertand‘] c = d.copy() dc = deepcopy(c) dc[‘names‘].append(‘Clive‘) print c print dc #结果如下: {‘names‘: [‘Alfed‘, ‘Bertand‘]} {‘names‘: [‘Alfed‘, ‘Bertand‘, ‘Clive‘]}
3.fromkeys:使用给定的键建立新字典
>>> {}.fromkeys([‘name‘,‘age‘]) {‘age‘: None, ‘name‘: None} >>> dict.fromkeys([‘name‘,‘age‘]) {‘age‘: None, ‘name‘: None}
4.get:更宽松的访问字典方法
一般来说,如果试图访问字典中不存在的项时会出错,而用get就不会
>>> d = {} >>> d[‘name‘] Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: ‘name‘ >>> print d.get(‘name‘) None
可以看到,但是用get访问一个不存在的键时,没有任何异常,而得到了None值。还可以自定义默认值,替换None
>>> print d.get(‘name‘,‘N/A‘) N/A
如果键存在,get用起来就像普通的字典查询一样
>>> d[‘age‘] = 43 >>> d.get(‘age‘) 43
5.haskey:判断是否有特定键
相当于表达式k in d.
6.item与iteritems:将字典的值以列表形式返回
items方法将字典中所有项以列表的形式返回,列表中的每一项表示为(键、值)对的形式,但是项在返回时并没有遵循特定的次序
>>> d = {‘name‘:‘Lily‘,‘age‘:24} >>> d.items() [(‘age‘, 24), (‘name‘, ‘Lily‘)]
iteritems方法的作用大致相同,但是会返回一个迭代器对象而不是一个列表
>>> it = d.iteritems() >>> print it <dictionary-itemiterator object at 0x7f54e5fff158> >>> print list(it) [(‘age‘, 24), (‘name‘, ‘Lily‘)]
7.keys与iterkeys:将字典中的键以列表形式返回
keys方法将字典中的键以列表形式返回,iterkeys则返回针对键的迭代器
8.pop:获得相应键的值,并删除键值对
>>> d {‘age‘: 24, ‘name‘: ‘Lily‘} >>> d.pop(‘name‘) ‘Lily‘ >>> d {‘age‘: 24}
9.popitem:弹出最后一个元素
列示于list.pop,后者会弹出列表的最后一个元素。但不同的是,popitems弹出随机的项,因为字典并没有“最后的元素”或者其他有关顺序的概念。弱项一个接一个的移除并处理项,这个方法就非常有效了
10.setdefault:获得给定键相关联的值
类似于get方法,能够获得与给定键相关联的值,除此之外,setdefault还能在字典中不含有给定键的情况下设定相应的键值
>>> d = {} >>> d.setdefault(‘name‘,‘N/A‘) ‘N/A‘ >>> d {‘name‘: ‘N/A‘} >>> d[‘name‘] = ‘Gumby‘ >>> d.setdefault(‘name‘,‘N/A‘) ‘Gumby‘ >>> d {‘name‘: ‘Gumby‘}
可以看到,当键不存在时,setdefault返回默认值并且相应的更新字典。如果键存在,那么就返回与其对应的值,但不改变字典。默认值是可选的,这点和get一样,如果不设定,就会使用None
>>> d = {} >>> d.setdefault(‘name‘,[]).append(my_sister) >>> d {‘name‘: [‘Anne‘]} >>> d.setdefault(‘name‘,[]).append(‘my_sister‘) >>> d {‘name‘: [‘Anne‘, ‘my_sister‘]}
11.update:利用一个字典项更新另一个字典
例:
>>> d = {‘name‘:‘Gumby‘,‘age‘:42,‘address‘:‘BeiJing‘} >>> x = {‘name‘:‘Lily‘} >>> d.update(x) >>> d {‘age‘: 42, ‘name‘: ‘Lily‘, ‘address‘: ‘BeiJing‘} #d中的name值已随x更新 >>> x {‘name‘: ‘Lily‘}
12.values与itervalues:返回字典中的值
values方法以列表的形式返回字典中的值,itervalues返回值得迭代器
4.3 小结
映射:映射可以使用任意不可变对象标识元素。最常用的类型是字符串和元组。python唯一内建的映射类型是字典
利用字典格式化字符串:可以通过在格式化说明符中包括名称(键)来对字典应用字符串格式化操作。当在字符串格式化中使用元组时,还需要对元组中的每一个元素都设定“格式化说明符”,在使用字典时,所用的说明符可以比在字典中用到的项少
字典的方法: