映射:映射可使用任何不可变对象表示元素,最常用的类型为字符串和数组,Python唯一内建的映射类型是字典。
可通过在格式化说明符中包含名称(键)来对字典应用字符串格式化操作,挡在字符串格式化中使用元组时,有必要对元组的每个元素都设定“格式化说明符”,而使用字典时所用的格式化说明符要更少。
字典的方法很多,调用的方式与调用列表和字符串的方法类似。
在某些情况下,字典列表更实用:
- 标记游戏棋盘的状态,每个键都是由坐标值组成的元组;
- 存储文件修改次数,用文件名作为索引;
- 电话薄或地址薄等联系方式。
例如:
>>>phonebook = {‘Lily’:’123′, ‘Lucy’:’134′, ‘lisa’:’135′}
字典由多个键及与其对应的值对组成(常被称为键/值对,也称为项),上例中名字是键,电话号码是值。每个键和它的值之间用冒号(:)隔开,项之间用逗号(,)隔开,整个字典由一对大括号括起来。空子电由两个大括号组成,{}.字典中的键必须唯一,值可以不唯一。
family = {‘Lucy’:'one baby’,'Lily’:'two baby’,'lisa’:'two baby’}
dict函数,可以通过其他字典或者(键,值)这样的序列对建立字典
>>>items = [('name','Qiu'),('age','23')]
>>>d = dict(items)
>>>d
{‘age’: ’23′, ‘name’: ‘Qiu’}
>>>d['name']
‘Qiu’
>>>d = dict(name=’Qiu’,age=23)
>>>d
{‘age’: 23, ‘name’: ‘Qiu’}
>>> d1=dict(d)
>>> d1
{‘age’: 23, ‘name’: ‘Qiu’}
字典的基本操作,很多都类似于序列:
- len(d)返回项的数目
- d[k]返回关联到键k上的值
- d[k]=v 将值v关联到键k上
- del d[k] 删除键为k的项
- k in d 检查d中是否有键为k的项
- 键类型:字典的键不一定为整形数据,也可能为其他不可变类型,比如:浮点型(实型)、字符串或元组。
- 自动添加和初始化值:即使键不一定存在字典中,也可以为它分配一个值,这样字典建立了新的项。但对于列表,我们不能将值关联到列表长度范围之外的索引上(不使用append或者类似操作)。
- 成员资格:表达式k in d 查找的是键而不是值,表达式 v in l(l为list)则查找的是值而不是索引。在字典中检查键的成员资格比列表中检查值的成员操作更加高效,数据规模越大,两者效率差距越明显。
>>>x= {}
>>>x[23] = ‘age’
>>>x
{23:’age’}
、字典格式化字符串:
>>>phonebook = {‘Lily’:’123′, ‘Lucy’:’134′, ‘lisa’:’135′}
>>>”Lily’s phone number is %(Lily)s. ” % phonebook
“Lily’s phone number is 123″
#只要给出的键能在字典中找到,就可以获得任意数量的转换说明符,这类字符串格式化在模板系统中非常有用,例如HTML中(下列代码单独保持在.py格式的文本中,非在IDLE直接执行):
template = ”’<html>
<head><title>%(title)s</title></head>
<body>
<h1>%(title)s</h1>
<p>%(text)s</p>
</body>”’
data = {‘title’:'My Home Page’,
‘text’:'Welcome to my home page!’} print template % data
、常见字典方法
1. clear方法,清除字典中所有的项,原地操作方法(与list.sort类似),无返回值或说返回值为None:
>>>x = {}
>>>y = x#其实这里x,y可看成是两个指向内存存储同一块数据的指针,详细的原因不细说
>>>x['key'] = ‘value’
>>>x = {}#x只是指向空字典的数据块,并没有清除元数据块上的数据
>>>y
{‘key’:'value’}#y指针的指向未改变。请看如下clear的操作:
>>>x = {}
>>>y = x#其实这里x,y可看成是两个指向内存存储同一块数据的指针
>>>x['key'] = ‘value’
>>>y
{‘key’:'value’}
>>>x.clear()#clear方法清除了x所指向的数据块上的数据
>>>y
{}
>>>x
{}
2. copy方法,返回一个具有相同键/值对的新字典,这就是传说中的浅拷贝方法:
>>>x = {’1′:’a',’2′:['b','c','d']}
>>> y = x.copy()
>>>y['1'] = ‘e’
>>>y['2'].remove(‘c’)
>>>y
{’1′:’e',’2′:['b','d']}
>>>x
{’1′:’a',’2′['b','d']}#这里我们就可以看出浅拷贝的特点,在副本字典替换值时,原始字典不受影响,但如果修改某个值(原地修改不是替换),原始字典也发生了改变。解决的办法是使用深拷贝:
>>>from copy import deepcopy
>>>d = {’1′:['a','b']}
>>>c = d.copy()
>>>dc = deepcopy(d)
>>>d['1'].append(‘c’)
>>>c
{’1′:['a','b','c']}
>>>dc
{’1′,['a','b']}
#关于浅拷贝和深拷贝的说明:
- 在浅拷贝中,d['1']与c['1']引用相同的对象,copy只是一个引用,所以修改一个另一个也会改变,但替换则是把指针指向了新的对象。
- deepcopy中,d['1']与dc['1']引用的是不同的对象。
浅copy隐藏的知识:
- 在副本字典中修改这些不可变对象(如字符串,数字,元组[只包含不可变对象的元组])是不会影响原始字典 。
- 在副本字典中修改可变对象,那么原始字典的内容会被影响。
原因:不可变对象发生变化时会生成新的引用指向新的值,而可变对象的值发生变化时,不会生成新的引用。
3. fromkeys方法,使用给定的键和默认值(默认为None)建立新的字典:
>>>{}.fromkeys(['name','age'],None)
{‘age’:None,’name’:None}
>>>{}.fromkeys(['1','2'],’unknown’)
{’2′:’unknown’,’1′:’unknown’}
4. get方法:相对于d[key],更宽松的访问字典项的方法,当访问一个不存在的键时,返回None值,还可以定义返回的默认值替换None:
>>>print d.get(‘name’)
None
>>>print d.get(‘name’,'N/A’)
‘N/A’
>>>d = {’1′:’a'}
>>>print d.get(’1′)
‘a’
5. has_key犯法检查字典是否含有给定的键,相当于k in d,Python3.0不在包含这个函数。
>>>d = {‘key’:'name’}
>>>d.has_key(‘key’)
True
>>>d.has_key(‘other’)
False
6. items和iteritems方法,items方法将字典所有的项以列表的方式返回,返回的项(键和值组成元组的形式)并没有特殊顺序,iteritems返回的是列表的迭代器:
>>>d = {’1′:’a',’2′:['b','c']}
>>>d.items()
[('1','a'),('2',['b','c'])]
>>>print list(d.iteritems())
[('1','a'),('2',['b','c'])]
7. keys和iterkeys方法,类似于items和itertems,但返回的是字典中的键(以列表的形式,无序),iterkeys返回的是迭代器:
>>>d = {’1′:’a',’2′:['b','c']}
>>>d.keys()
['1','2']
8. pop方法,用于获取对应于给定键的值并将这个键/值对从字典中移除,返回的是键对应的值。
>>>d = {‘x’:1,’y':2}
>>>d.pop(‘x’)
1
>>>d
{‘y’:2}
9. popitem方法类似于list.pop,后者弹出列表的最后一个元素,但由于字典中没有顺序的概念所以popitem方法弹出随机的项(其实在实践的过程中发现往往是按照字典中项的顺序,一个一个从左到右弹出),一个一个的弹出并移除字典中的项,若不想首先获取键值再去弹出项,这个方法非常有效。
>>>d = {’1′:’a',’2′:’b'}
>>>d.popitem()
(’1′,’a')
>>>d
{’2′:’b'}
10. setdefault方法在某种程度上类似于get,若键存在则获取与给定键对应的值,若字典中不含给定的键则设定该键对应的值并添加到字典最后返回键对应的值(若不设置,默认为None)。
>>> d = {}
>>> d.setdefault(‘name’,'N/A’)
‘N/A’
>>>d
{‘name’:'N/A’}
11. update方法,利用一个字典项更新另外一个字典,若键相同则被覆盖,否则添加新的项。该方法可以与dict函数同样的方式进行调用,意味着可以和映射、拥有(键,值)对的序列(或者其他可迭代对象)以及关键字参数一起调用。
>>> d = {‘title’:'Great Website’,'url’:'www.tebik.com’,'changed’:Sep 20 22:10:11 Shanghai 2012′}
>>> x = {‘title’:'Great Python Website’}
>>> d.update(x)
>>> d
{‘url’: ‘www.tebik.com’, ‘changed’: Sep 20 22:10:11 Shanghai 2012′, ‘title’: ‘Great Python Website’}
12. values和itervalues类似于keys和iterkeys以及items和itertems,以列表的形式返回字典中的所有的值,返回值的列表可能包含重复元素,itervalues返回迭代器:
>>> d = {1:’a',2:’b',3:’a'}
>>> d
{1: ‘a’, 2: ‘b’, 3: ‘a’}
>>> d.values()
['a', 'b', 'a']