映射,字典是python里唯一内建的映射类型,字典中的值没有特殊顺序,但都存储在一个特定的key里,键可以是数字,字符,元组
1.字典的使用
字典比列表更适用的场景:
表征游戏棋盘的状态,每个键都是由坐标值组成的元组;
存储文件修改次数,用文件名作为栈;
数字电话/地址薄
>>> names = ['Alice', 'Beth', 'Cecil', 'Dee', 'Earl']
>>> numbers = ['2312', '3421', '4567','5574','0932']
>>> numbers[names.index('Cecil')] 4567
使用字符串表示电话号码。因为八进制以0开头,
2.创建和使用字典
phonebook = {'Alice': '2312', 'Beth': '3421', 'Cecil': '4567'}
键值对成为项,项之间用逗号隔开,键和值之间使用冒号隔开,整个字典有一个{ }括起来,空字典{ }
2.1 dict函数
通过其他映射(比如字典)或者(键,值)这样的序列对建立字典
>>>items = [{'name', 'Gumby'}, {'age', 42}] >>>d = dict(items) >>>d {'age': 42, 'name': 'Gumby'} >>> d['name'] ‘Gumby'
dict函数也可以通过关键字参数创建字典
>>> d= dict(name='Gumby', age=42) >>>d {'age': 42, 'name': 'Gumby'}
以映射作为dict函数的参数,以建立其项与映射相同的字典
2.2基本字典操作
字典的基本行为很多方面与序列类似,
len(d) 返回d中项(键值对)的数量
d[k] 返回关联到键k上的值
d[k]=v 将值v关联到键k上
del d[k] 删除键为k的项
k in d 检查d中是否有含有键k的项
字典和列表区别:
键类型,字典的键不一定为整型数据,也可能是其他不可变类型,比如浮点型,字符串或元组
自动添加,即使那个键最长在字典中不存在,也可以为它分配一个值,这样字典会建立新的项
而(在不使用append方法或者其他类似操作的情况下)不能将值关联到列表范围之外的索引上
成员资格,表达式 k in d(d为字典)查找的是键,而不是值。表达式 v in l(l为列表)用来查找值。
>>> x= { } >>> x[42] = 'Foobar' >>>x {42: 'Foobar'}
>>> x= [ ] >>> x[42] = 'Foobar' 报错,空列表不存在这个位置,需要首先初始化如【None]*43
2.3字典的格式化字符串
在每个转换说明符中的%后面,加上(用圆括号括起来的)键,后面再跟上其他说明元素
>>>phonebook {'Alice': '2312', 'Beth': '3421', 'Cecil': '4567'}
>>>"Cecil's phone number is %(Cecil)s." % phonebook "cecil's phone number is 4567.“
当以这种方式工作时,只要所有给出的键都能在字典中找到,就可以获得任意数量的转换说明符(多个%(键))
2.4字典方法
2.4.1 clear
清除字典中所有的项,无返回值
>>> d = []>>> d['name'] = 'Gumby'
>>> d['age'] = 42
>>> d
{'age': 42, 'name': 'Gumby' }
>>> returned_value = d.clear()
>>> d
{ }
>>> print returned_value
None
清空原始字典的所有元素,必须用clear
>>> x= {} >>> x= {}>>> y = x >>> y = x
>>> x['key'] ='value' >>> x['key'] = 'value'
>>> y >>> y
{'key': 'value'} {'key': 'value'}
>>> x.clear() >>> x = { }
>>>y >>> y
{ } {'key': 'value'}
2.4.2 copy
返回一个具有相同键-值对的新字典(浅复制,原地修改某个值,原始字典也会改变)
from copy import deepcopy
c = d.copy()
dc = deepcopy(d)
2.4.3 fromkeys
使用给定的键建立新的字典,每个键默认对应值为None
>>> {}.fromkeys(['name', 'age']) {'age': None, 'name': None}
>>> dict.fromkeys(['name', 'age']) {'age': None, 'name': None}
>>> dict.fromkeys(['name', 'age'], '(unknown)' ) {'age': unknown, 'name': unknown}
2.4.4 get方法
更宽松的访问字典项的方法,一般访问字典中不存在的项会出错,但是get不会
当get访问到一个不存在的键时,没有任何异常,而得到了None值。还可以自定义默认值
>>> d = {} >>>print d.get('name') None
>>> print d.get('name', 'N/A') 'N/A'
若键值存在,则如同普通字典查询
>>> d['name'] = 'Eric' >>>d.get('name') 'Eric'
2.4.5 hash_key
检查字典中是否包含给出的键,表示式hash_key(k)相当于k in d, 有True
2.4.6 items和iteritems
items方法将所有的字典项以列表方式返回,这些列表项中的每一项都来自(键,值),但是项在返回时并没有特殊的顺序
iteritems会返回一个迭代器对象而不是列表
2.4.7 keys 和iterkeys
keys方法将字典中的键以列表形式返回,而iterkeys则返回针对键的迭代器
2.4.8 pop
获得对应于给定键的值,然后将这个键值对从字典中移除
2.4.9 popitem
类似于list.pop,后者会弹出列表的最后一个元素,但不同的是popitem弹出随机的项,因为字典并没有最后的元素或者其他有关顺序的概念,
弱项一个接一个移除并处理项,可以使用,
2.4.10 setdefault
在某种程度上类似get方法,就是能够获得与给定键值相关联的值,还能在字典中不含有给定键的情况下设定相应的键值
当键不存在时,会返回默认值并相应的更新字典,如果键存在,就返回与其对应的值,但不改变字典
2.4.11 update
用一个字典项更新另一个字典
2.4.12 values和itervalues
values方法以列表的形式返回字典中的值(itervalues返回值的迭代器),与返回键的列表不同的是,返回值的列表中可以保护重复的元素
>>> d = {}
>>> d[1] =1 >>> d[2] = 2 >>> d[3] =3 >>> d[4] = 4
>>> d.values() [1, 2, 3, 1]