1、字典的使用
某些情况下,字典比列表更加适用,比如:
表征游戏棋盘的状态,每个键都是由坐标值组成的元组;
存储文件修改次数,用文件名作为键;
数字电话/地址簿。
假如有一个人名列表如下:
>>> names = ['Alice','Beth','Cecil','Dee','Earl']
一个电话号码的列表如下:
>>> numbers = ['2341','9102','3158','0142','5551']
建立了这些列表后,可以通过如下方式查找Cecil的电话号码:
>>> numbers[names.index('Cecil')]
'3158'
这样虽然可以,担并不实用。
2、创建和使用字典
字典可以通过下面的方式创建
phonebook = {'Alice':"2341','Beth':'9102','Cecil':'3258'}
字典由多个键及与其对应的值构成的对组成(我们把键/值对称为项)
在上例中,名字是键,电话号码是值。
空字典由两个大括号组成,像这样:{}
3、dict函数
可以用dict函数,通过其他映射(比如其他字典)或者(键,值)这样的序列对建立字典。
>>> items = [('name','Gumby'),('age',42)]
>>> d = dict(items)
>>> d
{'age': 42, 'name': 'Gumby'}
dict函数也可以通过关键字参数来创建字典,如下例所示:
>>> d = dict(name='Gumby',age=42)
>>> d
{'age': 42, 'name': 'Gumby'}
4、基本字典操作
字典的基本行为在很多方面与序列类似:
len(d)返回d中项的数量;
d[k]返回关联到键k上的值;
d[k]=v将值v关联到键k上;
del d[k]删除键为k的项;
k in d检查d中是否含有键为k的项。
5、字典的格式化字符串
>>> phonebook
{'Beth': '9102', 'Alice': '2341', 'Ceil': '3258'}
>>> "Ceil's phone number is %(Ceil)s." % phonebook
"Ceil's phone number is 3258."
除了增加的字符串键之外,转换说明符还是像以前一样工作。
6、字典方法
(1)clear
clear方法清除字典中所有的项。
第一种情况:
>>> x = {}
>>> y=x
>>> x['key'] = 'value'
>>> y
{'key': 'value'}
>>> x = {}
>>> y
{'key': 'value'}
第二种情况:
>>> x = {}
>>> y=x
>>> x['key'] = 'value'
>>> y
{'key': 'value'}
>>> x.clear()
>>> y
{}
两种情况中,x和y最初对应同一个字典,情况一中,通过将x关联到一个新的空字典对y一点影响也没有,y还关联到原来的字典,如果想清空原始字典中所有的元素,必须使用clear方法。
(2)copy
copy方法返回一个具有相同键-值对的新字典(这个方法实现的是浅复制,因为值本身就是相同的,而不是副本)
>>> x = {'username' : 'admin','machines' : ['foo','bar','baz']}
>>> y=x.copy()
>>> y
{'username': 'admin', 'machines': ['foo', 'bar', 'baz']}
>>> y['username']='mlh'
>>> y['machines'].remove('bar')
>>> y
{'username': 'mlh', 'machines': ['foo', 'baz']}
>>> x
{'username': 'admin', 'machines': ['foo', 'baz']}
当在副本中替换值的时候,原始字典不受影响,但是如果修改了某个值(原地修改,而不是替换),原始的字典也会改变,因为同样的值也存储在原字典中。
避免这个问题的一种方法是使用深复制
>>> from copy import deepcopy
>>> d = {}
>>> d['names'] = ['qiqi','qiqijianglu']
>>> c =d.copy()
>>> dc = deepcopy(d)
>>> d['names'].append('cccc')
>>> c
{'names': ['qiqi', 'qiqijianglu', 'cccc']}
>>> dc
{'names': ['qiqi', 'qiqijianglu']}
(3)fromkeys
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'}
(4)get
get访问一个不存在的键时不会出现异常,而会得到None值
>>> print d.get('name')
None
还可以自己定义默认值替换None
(5)has_key可以检查字典中是否含有给出的键
>>> d={}
>>> d
{}
>>> d.has_key('name')
False
>>> d['name']='qiqi'
>>> d.has_key('name')
True
(6)items和iteritems
items将所有的字典项以列表方式返回
>>> d = {'qiqi':111,'alice':222}
>>> d.items()
[('qiqi', 111), ('alice', 222)]
iteritems方法的作用大致相同,返回的是一个迭代器对象而不是列表
>>> it = d.iteritems()
>>> it
<dictionary-itemiterator object at 0x1fe81b0>
>>> list(it)
[('qiqi', 111), ('alice', 222)]
(7)keys和iterkeys
keys方法将字典中的键以列表形式返回,而iterkeys则返回针对键的迭代器
(8)pop
pop方法用来获得对应于给定的键的值,然后将这个键-值对从字典中移除
(9)popitem
弹出列表中的最后一个元素,popitem弹出的是随机的项,因为字典没有顺序的概念
(10)setdefault
setdefault方法类似于get,就是能获得与给定键相关联的值,此外,还能在字典中不含有给定键的情况下设定相应的键值。
>>> d={}
>>> print d.setdefault('name','qiqi')
qiqi
>>> d
{'name': 'qiqi'}
(11)update
update方法可以利用一个字典项更新另外一个字典
(12)values和itervalue
values方法以列表的形式返回字典中的值