字典是一种通过名字引用值的数据结构。这种结构类型称为映射。字典是Python中唯一内建的映射类型
字典中的值并没有特殊的顺序,都存储在一个特定的键(Key)里,键可以是数字、字符串甚至是元组
1.创建
使用dict函数,通过其他映射(比如其他字典)或者(键、值)这样的序列对建立字典
也可以通过关键字参数来创建字典
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为列表)则用来查找值,而不是索引
1 people = { 2 'Alice': { 3 'phone': '2341', 4 'addr': 'Foo drive 23' 5 }, 6 7 'Beth': { 8 'phone': '9102', 9 'addr': 'Bar street 42' 10 }, 11 12 'Cecil': { 13 'phone': '3158', 14 'addr': 'Baz avenue 90' 15 } 16 } 17 18 labels = { 19 'phone': 'phone number', 20 'addr': 'address' 21 } 22 23 name = input('Name: ') 24 request = input('Phone number (p) or address (a)? ') 25 26 if request == 'p': key = 'phone' 27 if request == 'a': key = 'addr' 28 29 if name in people: print("%s's %s is %s." % (name, labels[key], people[name][key]))
3.字典的格式化字符串
使用字典而不是元组来做这个工作时,在每个转换说明符中的%字符后面,可以加上(圆括号括起来的)键,后面再跟上其他的说明元素
除了增加的字符串键之外,转换说明符还是像之前一样
以这种方式使用字典的时候,只要给出的键在字典中找到,就可以获得任意数量的转换说明符,这类字符串格式化在模板系统中非常有用
1 template = '''<html> 2 <head><title>%(title)s</title></head> 3 <body> 4 <h1>%(title)s</h1> 5 <p>%(text)s</p> 6 </body>''' 7 8 data = {'title': 'My Home Page', 'text': 'Welcome to my home page!'} 9 print(template % data)
4.字典方法
clear() 清除字典中的所有项,这个方法无返回值(返回None)
考察以下两种情况
两种情况中,x和y最初对应同一个字典。情况1中,通过将x关联到一个新的空字典来”清空“它,这对y一点影响都也没有,它还关联到原先的字典。
但如果真的想清空原始字典中的所有元素,必须使用clear方法
copy() 返回一个具有相同键-值对的新字典(这个方法实现的是浅复制,因为值本身就是相同的,而不是 副本)
副本中替换值的时候,原始字典不受影响,但是如果修改了某个值(原地修改,而不是替换)原始的字典也会改变,因为同样的值也存储在原字典中
可以使用深复制来避免这一问题,复制其包含的所有值,可以使用copy模块的deepcopy函数来完成操作
fromkeys() 使用给定的键建立新的字典,每个键默认对应的值为None
也可以直接在所有字典的类型dict上面调用方法
也可以自己提供默认值
get() 一种更宽松的访问字典项的方法,一般来说,在试图访问字典中不存在的项时会出错,但是在使用get()时就不会
当使用get()访问一个不存在的键时,没有任何异常,得到了None值,还可以自己定义”默认”值,来替换None;如果键存在,get()用起来就像普通的字典查询一样
get()可以使得程序在用户输入未准备的值时也能做出合理的反应,下面是电话簿程序使用get()方法的版本
1 people = { 2 'Alice': { 3 'phone': '2341', 4 'addr': 'Foo drive 23' 5 }, 6 7 'Beth': { 8 'phone': '9102', 9 'addr': 'Bar street 42' 10 }, 11 12 'Cecil': { 13 'phone': '3158', 14 'addr': 'Baz avenue 90' 15 } 16 } 17 18 labels = { 19 'phone': 'phone number', 20 'addr': 'address' 21 } 22 23 name = input('Name: ') 24 request = input('Phone number (p) or address (a)? ') 25 26 key = request 27 if request == 'p': key = 'phone' 28 if request == 'a': key = 'addr' 29 30 person = people.get(name, {}) 31 label = labels.get(key, key) 32 result = person.get(key, 'not available') 33 34 35 print("%s's %s is %s." % (name, label, result))
has_key 与k in d 是一样的,python3中不包括这个函数
items() 以列表形式返回可遍历的(键, 值) 元组数组
keys() 以列表形式返回字典中的键
values() 以列表形式返回字典中的值
setdefault() 类似get()方法,能够获得与给定键相关联的值
当键不存在的时候,setdefault()返回默认值并且相应地更新字典。如果键存在,那么就返回与其对应的值,但不改变字典
默认值是可选的,如果不设定,就默认使用None
pop() 用来获得给定键的值,然后将这个键-值对从字典中移除
popitem() 弹出字典中最末尾的项,在希望一个接一个地移除并处理项时,很有用(因为不用首先获取键的列表)
如果字典已经为空,而使用了此方法,会报出KeyError异常
update() update()可以利用一个字典项更新另外一个字典
提供的字典中的项会被添加到旧的字典中,若有相同的键则会进行覆盖