![Python编程基础与应用](https://wfqqreader-1252317822.image.myqcloud.com/cover/854/41309854/b_41309854.jpg)
2.5.2 字典的基本操作与方法
1.访问字典
列表和元组是通过下标来访问元素的,而字典不同,它通过键来访问对应的值。因为字典中的元素是无序的,每个元素的位置都不固定,所以字典也不能像列表和元组那样,采用切片的方式一次性访问多个元素。
Python访问字典元素的具体格式为:
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/75_01.jpg?sign=1739532383-YEBAEIWNuwyw2yiS5YsrkCGONbwcAcWM-0-43fcef87011d91cc4a857678bf5d2e39)
其中,dictname表示字典变量的名字,key表示键名。注意,键必须是存在的,否则会报异常。
【例2-46】 通过键访问字典。
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/75_02.jpg?sign=1739532383-lZrxUPvb5ZUU6EuOHuyGN2XVhfnZHEXy-0-1c2338f14c6d4bbf21ef80626b638a7a)
运算结果:
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/75_03.jpg?sign=1739532383-WsdfTJZSXa3CD1Qoab0kbeIFMx43n2jO-0-125861561ff9564c103ea2dea48b44c6)
除了上面这种方式外,Python也推荐使用dict类型提供的get()方法来获取指定键对应的值。当指定的键不存在时,get()方法不会抛出异常。
get()方法的语法格式为:
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/75_04.jpg?sign=1739532383-YnCF2WKkWp2hy77Qf5nUlSjE78Tj1aEr-0-65b213439ef4d28a6e5148a281d9d1ee)
其中,dictname表示字典变量的名字;key表示指定的键;default用于指定要查询的键不存在时,此方法返回的默认值,如果不手动指定,会返回None。
【例2-47】 通过get()方法访问字典。
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/75_05.jpg?sign=1739532383-IPOcliWqDuB4sDTVmT8NnGyRevgaTaD5-0-997d30c5d63c557b0be38b0f75b5db88)
运算结果:
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/75_06.jpg?sign=1739532383-5TgrU8MZi3fjTRSjRnfPzC1eIffE5zds-0-a7b9383f54fa8df78c8396e2ebb0e955)
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/76_01.jpg?sign=1739532383-pX4c38RPCDYvRUar2iGyyRXmvTcpmHow-0-e193382657225a514374e07b3e6e398f)
本例中可以看到,当键不存在时,get()返回空值None,如果想明确地提示用户该键不存在,那么可以手动设置get()的第二个参数。
2.删除字典
和删除列表、元组一样,手动删除字典也可以使用del关键字。
【例2-48】 通过get()方法访问字典。
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/76_02.jpg?sign=1739532383-8nq8iAP3j8NAfp8bDtBMhfPKyfh4NCY8-0-329aa05f124ce2eb0a88e8d5a8160a3a)
运算结果:
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/76_03.jpg?sign=1739532383-lIT44SqSAp7JGzZeqKBGnPx1Yi1TjfXG-0-7a78c325345c71f9b2b1f18a9cd8d14a)
3.添加键值对
为字典添加新的键值对很简单,直接给不存在的key赋值即可,具体语法格式如下:
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/76_04.jpg?sign=1739532383-YuxMsCicOGUUhINQLbojwhVbT0uvULh0-0-90ab71e12a2b3537b3a70d17b789ca9d)
其中,dictname表示字典名称,key表示新的键,value表示新的值,只要是Python支持的数据类型都可以。
【例2-49】 添加字典键值对。
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/76_05.jpg?sign=1739532383-MBcJlguPSIolvktABAFHnyDRrA9FCl0M-0-ffde271b57aefb872b2d47648a5516c8)
运算结果:
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/76_06.jpg?sign=1739532383-bRLcbVQWFtIzzWcslRtqHNX9rIDQJLrz-0-d8ae468a239023293a676a89f7cd6acd)
4.修改键值对
字典中键(key)的名字不能修改,只能修改值(value)。字典中各元素的键必须是唯一的,因此,如果新添加元素的键与已存在元素的键相同,那么键所对应的值就会被新的值替换掉,以此达到修改元素值的目的。
【例2-50】 添加字典键值对。
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/77_01.jpg?sign=1739532383-0nMZn7IULkd8ZPHlaZnfP9jheFuGgbru-0-a58b89e4df2cb26f5afff9ca5dea27c4)
运算结果:
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/77_02.jpg?sign=1739532383-cdwpubb1X3FMF6IwYqbGPokVNwh0TK7j-0-3a16b7ad13194efc6f72c9ccc4f602c1)
例中可以看到,字典中没有再添加一个{'第三名': 8.13}键值对,而是对原有键值对{'第三名':7.65}中的value做了修改。
5.删除键值对
如果要删除字典中的键值对,还可以使用del语句。
【例2-51】 使用del语句删除键值对。
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/77_03.jpg?sign=1739532383-jhdAqridCQ0EfValg7jYwenOFaL9Q9s7-0-0c8c2541055e864d9acc0c47db94b515)
运算结果:
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/77_04.jpg?sign=1739532383-FTrbDtDHYExnvODgB2DSLkrYlXmNgnDk-0-a4b529f1d6e3054ef3541b3a5a8b6eb9)
6.判断字典中是否存在指定键值对
如果要判断字典中是否存在指定键值对,首先应判断字典中是否有对应的键。判断字典是否包含指定键值对的键,可以使用in或not in运算符。
需要指出的是,对于dict而言,in或not in运算符都是基于key来判断的。
通过in(或not in)运算符,可以很轻易地判断出现有字典中是否包含某个键,如果存在,由于通过键可以很轻易获取对应的值,因此很容易就能判断出字典中是否有指定的键值对。
【例2-52】 使用del语句删除键值对。
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/77_05.jpg?sign=1739532383-MNw0eDJ7EBNgpEEMOCWyTtItHb93qTb1-0-e60d55b9485cb8f6714f0947dc160d6f)
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/78_01.jpg?sign=1739532383-DyT8lcnRUUR1EgWOQWeleNGMre2pbr8G-0-4f26c55488862bfacbd35d266d7ac720)
运算结果:
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/78_02.jpg?sign=1739532383-gypLfuQRamniNwM9muoyx6KvZbsT05Nm-0-f131942132bc0d8942ea446f4a7f9535)
7.keys()、values()和items()方法
将这3个方法放在一起介绍,是因为它们都用来获取字典中的特定数据:
● keys()方法用于返回字典中的所有键(key);
● values()方法用于返回字典中所有键对应的值(value);
● items()方法用于返回字典中所有的键值对(key-value)。
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/78_03.jpg?sign=1739532383-Talp7K4Rw0YDPB5jnkxXJYfc8qAoUlo3-0-394cddef9506458aeb5fbfb2e13c99c4)
2-8 获取字典中的特定数据
【例2-53】 获取字典中的键、值及键值对数据。
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/78_04.jpg?sign=1739532383-uvooUV3MtBOaJiqPADz7434iSPXoP2GJ-0-2c78decc57c02d3389ed4320d989da5a)
运算结果:
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/78_05.jpg?sign=1739532383-eQG9tEcOHu0rqnxURg9sIG91WelwO15U-0-d9ea00140ab53b5fbb4ef21e33877617)
从例中可以发现,keys()、values()和items()返回值的类型分别为dict_keys、dict_values和dict_items,并不是常见的列表或者元组类型。如果需要列表类型等类型,则使用list()函数将它们返回的数据转换成列表或使用for in循环遍历它们的返回值。
【例2-54】 获取字典中的键、值及键值对数据后返回列表类型。
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/78_06.jpg?sign=1739532383-lbfUrFetbQFwW9r0UQNYaCtFgOoUuwvQ-0-03700b23dcc636c1342cbbe853fcb0ea)
运算结果:
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/79_01.jpg?sign=1739532383-9Ptv5T8MQ8oih7sLSZrYpUoiEB6Y02BT-0-5ced9ce2c41955818cc10b2c5c6d2d77)
8.copy()方法
copy()方法是返回一个字典的副本,即返回一个具有相同键值对的新字典。
【例2-55】 字典的copy()方法应用。
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/79_02.jpg?sign=1739532383-kEEe57n2tnROHfus9gGSpGSSXDKy0K4w-0-287e10726f133562973a5f4e548fea77)
运算结果:
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/79_03.jpg?sign=1739532383-Z4c0IZ9Yof1u9PtokcHzMYCYcHZYtd3v-0-7da44b157f8b747e58d1a4d74d258659)
从运行结果不难看出,对a增加新键值对,b不变;而修改a的某键值对中列表内的元素,b也会相应改变。
9.update()方法
update()方法可以使用一个字典所包含的键值对来更新己有的字典。在执行update()方法时,如果被更新的字典中已包含对应的键值对,那么原value会被覆盖;如果被更新的字典中不包含对应的键值对,则该键值对被添加进去。
【例2-56】 字典的update()方法应用。
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/80_01.jpg?sign=1739532383-uckDTMwcGAcnnT5a0O8cGzJzdx4TuZI1-0-031075c6e0aa6e006b34ab49c1f07903)
运算结果:
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/80_02.jpg?sign=1739532383-iStTE6vrzOxrCnXardbKSRntabBWD6Hc-0-1e7a173807766fb9bcab19c177a34f64)
从运行结果可以看出,由于被更新的字典中已包含key为“No.2”的键值对,因此更新时该键值对的value将被改写;而被更新的字典中不包含key为“No.5”的键值对,所以更新时会为原字典增加一个新的键值对。
10.pop()和popitem()方法
pop()和popitem()都用来删除字典中的键值对,不同的是,pop()用来删除指定的键值对,而popitem()用来随机删除一个键值对,它们的语法格式如下:
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/80_03.jpg?sign=1739532383-h9wZys7WnJJOsWAtaUPXSxk7QA4p6zfT-0-e913a9aea8eaf76d7905bdee36590d5f)
其中,dictname表示字典名称,key表示键。
【例2-57】 指定删除或随机删除。
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/80_04.jpg?sign=1739532383-C7EVtiyy0bBlA1YKWTmHisUomfsXnkM9-0-20afb6f7c7fe2a47ceeb8fd1b3d796f7)
运算结果:
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/80_05.jpg?sign=1739532383-H8ogcrOtlxhfHubRHcV3mVmBBiq99xRW-0-60a3c5a0ef3476f5e66cc074229d6a29)
11.setdefault()方法
setdefault()方法用来返回某个key对应的value,其语法格式如下:
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/80_06.jpg?sign=1739532383-9laS8VEd85l9VdYBKI01QCcIq0VvMSRp-0-de1e7a47a89b8b1e6a3b7325783365f3)
说明,dictname表示字典名称,key表示键,defaultvalue表示默认值(可以不写,不写则为None)。
当指定的key不存在时,setdefault()会先为这个不存在的key设置一个默认的defaultvalue,然后再返回defaultvalue。也就是说,setdefault()方法总能返回指定key对应的value。
1)如果该key存在,那么直接返回该key对应的value;
2)如果该key不存在,那么先为该key设置默认的defaultvalue,然后再返回该key对应的defaultvalue。
【例2-58】 指定删除或随机删除。
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/81_01.jpg?sign=1739532383-IceSnlU9hi7LfLWGexhpIkIB9skMmB4m-0-58ab0242caa75255ea12a0bf7e1b474e)
运算结果:
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/81_02.jpg?sign=1739532383-FyoK2YighSeiYSyToofk01iURrLYFCSU-0-915cb8258eefb6af04777fc5fb4a69c0)
从例中可以看出,key为“'石化'”存在时,直接返回该key对应的value,即0.7,而不会更改为setdefault()方法中的0.68。