2.6 Dictionary类型
字典(Dictionary)是一种数据结构,它像列表一样存储多个元素,每个元素都包含一个键(Key)和值(Value),其中键是不能重复的,而值是可以重复的。字典中的键-值对没有特定的存储顺序,读者可以通过键来快速得到对应的值,这与通过书籍目录来快速查找章节一样。
Python中的字典使用大括号“{}”表示,其中的键-值对使用冒号分隔,键值对之间使用逗号分隔,例如:
>>> roomnumber = {"Aaron":"0001", "Tom":"0002", "Kate":"0003"}
2.6.1 访问字典元素
刚才讲到字典中的键类似于数据的目录,所以可以通过键来查找元素值,方法如下:
>>> roomnumber["Aaron"] '0001'
如果访问的键不存在,会输出错误:
>>> roomnumber["Richard"] Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'Richard'
2.6.2 检查字典中是否存在某个键
>>> "Aaron" in roomnumber True >>> "Jack" in roomnumber False
2.6.3 修改字典
1. 添加键-值对
可以通过访问字典值的方式添加键-值对,虽然字典中并不存在该键,但是字典会自动增加一个键-值对,如修改前面例子如下:
>>> roomnumber["Richard"]="0004" >>> roomnumber {"Aaron":"0001", "Tom":"0002", "Kate":"0003", "Richard":"0004"}
2. 删除一个键-值对
>>> del roomnumber["Kate"] >>> roomnumber {"Aaron":"0001", "Tom":"0002", "Richard":"0004"}
3. 修改一个键关联的值
>>> roomnumber["Richard"]="0003" >>> roomnumber {"Aaron":"0001", "Tom":"0002", "Richard":"0003"}
2.6.4 字典方法
1. clear
用于清空字典中的所有项,该方法不返回任何内容:
>>> roomnumber.clear() >>> roomnumber {}
2. copy
在讲解这个方法之前,先了解两个概念:浅拷贝和深拷贝。
对于可变对象如列表、字典,直接赋值时只会将一个对象的引用传递给另一个对象,此时修改其中一个对象就会改变另一个对象,如:
>>> a = [1,2,3] >>> b = a >>> a,b ([1, 2, 3], [1, 2, 3]) >>> a[0]=100 >>> a,b ([100, 2, 3], [100, 2, 3])
大多数情况下,一个可变对象内还可以嵌套其他可变对象,此时浅拷贝只会拷贝顶级对象,而对于嵌套的对象,只会拷贝它的引用,所以修改顶级对象不会影响另一个对象,但是如果修改嵌套的对象就会影响两个对象了:
>>> a = [1,2,3, ["Aaron", "Tom"]] >>> b = a.copy() >>> a,b ([1, 2, 3, ['Aaron', 'Tom']], [1, 2, 3, ['Aaron', 'Tom']]) >>> a[1]=100 >>> a,b ([1, 100, 3, ['Aaron', 'Tom']], [1, 2, 3, ['Aaron', 'Tom']]) >>> b[3][1]="Jacky" >>> a,b ([1, 100, 3, ['Aaron', 'Jacky']], [1, 2, 3, ['Aaron', 'Jacky']])
由此可见,在浅拷贝的情况下修改顶级元素不会影响另一个对象,但是修改内部可变元素时就会同时修改原始对象与新对象了,为了解决这个问题字典提供了一个深拷贝方法。深拷贝就是将顶级对象以及子对象的值同时拷贝给新对象,此时修改任何一个都不会影响另一个。
由于字典也是可变对象,所以copy方法也遵循以上原则。
如果想对字典进行深拷贝操作,需要引用copy包中的deepcopy方法:
>>> from copy import deepcopy >>> a = {"Aaron":"0001", "Tom":"0002", "Kate":"0003", "Richard":"0004"} >>> b = deepcopy(a) >>> a,b ({'Aaron': '0001', 'Tom': '0002', 'Kate': '0003', 'Richard': '0004'}, {'Aaron': '0001', 'Tom': '0002', 'Kate': '0003', 'Richard': '0004'}) >>> a["Aaron"]="1" >>> a,b ({'Aaron': '1', 'Tom': '0002', 'Kate': '0003', 'Richard': '0004'}, {'Aaron': '0001', 'Tom': '0002', 'Kate': '0003', 'Richard': '0004'})
3. fromkeys
使用给定的一些键创建一个新的字典,所有键对象的值为None。
>>> {}.fromkeys(["name", "age"]) {'name': None, 'age': None}
如果不想用None来作为默认值,也可以给定其他值:
>>> {}.fromkeys(["length", "width", "height"], 0) {'length': 0, 'width': 0, 'height': 0}
4. get
访问一个字典项,如果试图访问的字典项不存在时返回None,也可以返回其他值,对字典本身没有任何影响:
>>> a = {"Aaron":"0001", "Tom":"0002", "Kate":"0003", "Richard":"0004"} >>> a.get("Aaron") '0001' >>> a.get("Jacky") >>> a {'Aaron': '0001', 'Tom': '0002', 'Kate': '0003', 'Richard': '0004'} >>> a.get("Jacky", "N/A") 'N/A' >>> a {'Aaron': '0001', 'Tom': '0002', 'Kate': '0003', 'Richard': '0004'}
5. items
items会将字典中的所有项以列表的方式返回,返回时没有特殊顺序:
>>> a = {"Aaron":"0001", "Tom":"0002", "Kate":"0003", "Richard":"0004"} >>> a.items() dict_items([('Aaron', '0001'), ('Tom', '0002'), ('Kate', '0003'), ('Richard', '0004')])
6. keys
将字典中的键以列表的形式返回:
>>> a.keys() dict_keys(['Aaron', 'Tom', 'Kate', 'Richard'])
7. values
将字典中的值以列表的形式返回:
>>> a.values() dict_values(['0001', '0002', '0003', '0004'])
8. pop
删除一个键-值对并返回对应的值:
>>> a = {'Aaron': '0001', 'Tom': '0002', 'Kate': '0003', 'Richard': '0004'} >>> a.pop("Richard") '0004' >>> a {'Aaron': '0001', 'Tom': '0002', 'Kate': '0003'}
9. popitem
随机删除一个字典项并返回:
>>> a.popitem() ('Kate', '0003') >>> a {'Aaron': '0001', 'Tom': '0002'}
10. setdefault
与get方法基本一致,唯一的区别就是当键不存在时,setdefault方法会创建一个新字典项:
>>> a.setdefault("Lisa", "0005") '0005' >>> a {'Aaron': '0001', 'Tom': '0002', 'Lisa': '0005'}
11. update
根据一个字典项更新字典,如果字典项在原始字典中不存在则在字典中添加该项:
>>> a.update({"Lisa":"0003"}) >>> a {'Aaron': '0001', 'Tom': '0002', 'Lisa': '0003'} >>> a.update({"Tracy":"0004"}) >>> a {'Aaron': '0001', 'Tom': '0002', 'Lisa': '0003', 'Tracy': '0004'}