字典的使用
在某些情况下,字典比列表更加适用:
创建和使用字典
字典由多个键及与其对应的值构成的;
例:
phonebook = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}
其中名字键,电话号码是值,每个键和他的值之间用冒号:隔开,键之间用逗号,隔开,而整个字典由一对大括号括起来;
注意:字典中的键是唯一的(其他类型映射也是如此),而值并不一定;
dict 函数
可以用dict函数,通过其他映射或者(键,值)这样的序列创建字典,例:
基本字典操作
很多方面与序列(sequence)类似:
len(d):返回d中项(键:值对)的数量;
d[k]:返回某键上的值;
d[k] = v:将v值关联到键k上;
del d[k]:删除键为k的项;
k in d:检测d中是否含有键为k的项;
但是字典和列表也有一些区别:
键类型:字典的键不一定为整型数据,可能是浮点数、字符串或元组;
自动添加:即使起初那个键在字典中并不存在,也可以为它分配一个值,这样字典就会建立新的项;
成员资格:k in d 查找的是键,而不是它的值;
例:
例:使用人名作为键创建字典,每个人用一个字典;
代码:
运行结果:
字典的格式化字符串
如果使用字典来格式化字符串,在每个转换说明符(conversion specifier)%字符后面,可以加上用圆括号括住的键名,后面再跟上其它说明元素;
例:
例:使用字典格式化HTML文档;
代码:
运行结果:
字典方法
clear
用于清楚字典中的所有项;
例:
再看一种情况:
x和y指向同一个字典,如果将x关联到一个新的空字典(x = {}),y不受影响,但是如果执行x.clear(),那么原字典会被清空,y也会受到影响;
copy
该方法返回一个具有相同键-值对的新字典;
例:
这个方法实现的是浅复制(shallow copy),在副本中替换值的时候,原字典不会受到影响,如果修改了某个值,原字典也会改变;
为了避免这个问题,使复制的字典与原字典独立开,可是使用深复制(deep copy),使用copy模块的deepcopy函数:
fromkeys
该方法给一个给定的键建立新的字典,每个键默认为None;
例:
也可以使用字典类型dict:
get
它是一种更为宽松的访问字典项的方法,一般试图访问字典中不存在的项时会出错,而get不会;
例:
另外还可以设置get获取不存在项返回的默认值,如果键存在get就会返回键值;
例:使用get的简单数据库;
代码:
运行结果:
get带来的灵活性使程序在用户输入我们并未准备的值时也能做出合理的判断;
has_key
该方法用于检查字典中是否有给出的键,类似 k in d,在Python3.0中将不包括这个函数;
例:
items和iteritems
items方法将所有的字典项以列表方返回,列表中的每一项都来自于(键,值),但是返回时并没有特殊的排序;
例:
iteritems方法大致相同,但是它会返回一个迭代器对象而不是列表,例:
很多情况下使用iteritems更高效;
keys和iterkeys
keys方法将字典中的键以列表形式返回,而iterkeys则返回指向键的迭代器;
例:
pop
该方法用来获得对应给定键的值,然后将这个键-值对从字典移除;
例:
popitem
该方法类似list.pop,list.pop会弹出列表的最后一个元素,但是字典不存在顺序的概念(无序的),popitem会弹出随机的项;
例:
popitem可以一个接一个的弹出并移除项;
setdefault
类似get方法,可以获取给定键的值,此外,还能在字典中未存在给定值的情况下设定相应的键值;
例:
可以看出,当键不存在时,setdefault会用它的默认值出更新字典,如果键存在,则会返回该键对应的值;
setdefault的默认值是可选的,如果不设定会使用默认的None,例:
update
该方法可以利用一个字典去更新另一个字典;
例:
提供作为参数的字典中的项会被添加到旧字典,若有相同键时会进行覆盖;
values和itervalues
values方法以列表形式返回字典中的值,itervalues返回迭代器;
例:
与返回键的列表不同的是,返回值的列表中可以包含重复的元素;