![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=1739552947-y900C1sZ89of7M25ZufWIeektWFCic1A-0-50891675054285cb02427cb2fc7b6abf)
其中,dictname表示字典变量的名字,key表示键名。注意,键必须是存在的,否则会报异常。
【例2-46】 通过键访问字典。
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/75_02.jpg?sign=1739552947-1jQ9hjanZXApdgsMg1Jt63bojamdBtDS-0-f3f416f0e4d2b18d5de3e267cc02e2b8)
运算结果:
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/75_03.jpg?sign=1739552947-4xqsoUIZYS4rZumuC8utREKNfEX4LSAf-0-a143710557cc9b97159cfffce555518a)
除了上面这种方式外,Python也推荐使用dict类型提供的get()方法来获取指定键对应的值。当指定的键不存在时,get()方法不会抛出异常。
get()方法的语法格式为:
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/75_04.jpg?sign=1739552947-mEaDPhTRd7h7HtUZbIYVS0dzM0RC3JNH-0-fa266d2bddb5f2a821c364ebe68b3cf8)
其中,dictname表示字典变量的名字;key表示指定的键;default用于指定要查询的键不存在时,此方法返回的默认值,如果不手动指定,会返回None。
【例2-47】 通过get()方法访问字典。
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/75_05.jpg?sign=1739552947-qVKfFbeHJGKJZDU0997is067KZ0pufyS-0-b2a4e36c2bdf180f3fbfa295655cf9bc)
运算结果:
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/75_06.jpg?sign=1739552947-lyH9DYRV41oc2OqCgeHOHven0Getj6Bp-0-5be881aebb7890ff41d71c228562c68e)
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/76_01.jpg?sign=1739552947-Fg6DtqlayTSshigrYVHCsCDH7pvRbtFg-0-6b1c2f171f75616c7d78ceaf9498289f)
本例中可以看到,当键不存在时,get()返回空值None,如果想明确地提示用户该键不存在,那么可以手动设置get()的第二个参数。
2.删除字典
和删除列表、元组一样,手动删除字典也可以使用del关键字。
【例2-48】 通过get()方法访问字典。
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/76_02.jpg?sign=1739552947-6eEX1cwPYGWYJXF7j7tniuBc3TQnj8WE-0-193c99eb3f2cf10da6e1512b7a492f87)
运算结果:
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/76_03.jpg?sign=1739552947-LNQNKPSOtyb2yK1qFCmDHqhmHq3Cia6j-0-e68188095b41b488014ffef56e58077a)
3.添加键值对
为字典添加新的键值对很简单,直接给不存在的key赋值即可,具体语法格式如下:
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/76_04.jpg?sign=1739552947-nP9bo5Y7qR1sZGToOkLU30vQSCeaBcpG-0-8acf763e720e31927163fc63a7433737)
其中,dictname表示字典名称,key表示新的键,value表示新的值,只要是Python支持的数据类型都可以。
【例2-49】 添加字典键值对。
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/76_05.jpg?sign=1739552947-DHwsB6w7QidR6hIYWmaO8Rg9Azpjo77P-0-989ee9008df434a4fdf538676a99897f)
运算结果:
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/76_06.jpg?sign=1739552947-ENkCbjqoswmkZqVLIS9LJ6H6gePD3gnQ-0-c004672980a257b5d9e50b8525f24250)
4.修改键值对
字典中键(key)的名字不能修改,只能修改值(value)。字典中各元素的键必须是唯一的,因此,如果新添加元素的键与已存在元素的键相同,那么键所对应的值就会被新的值替换掉,以此达到修改元素值的目的。
【例2-50】 添加字典键值对。
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/77_01.jpg?sign=1739552947-tM23c4IpTLoj3jzx2TVYfaSdAiw7dHWX-0-0939ef9b4ccee0cba3d6d9ed9174da95)
运算结果:
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/77_02.jpg?sign=1739552947-qmymvFi2WXrPhZsQLjJkdwvXbRaQwahf-0-bba904debab90c92677486333e5e6ac7)
例中可以看到,字典中没有再添加一个{'第三名': 8.13}键值对,而是对原有键值对{'第三名':7.65}中的value做了修改。
5.删除键值对
如果要删除字典中的键值对,还可以使用del语句。
【例2-51】 使用del语句删除键值对。
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/77_03.jpg?sign=1739552947-0BXwfHRcncwvqVtf2wxb61Mghly43x2D-0-8ebd355ea9ba90a7b42541fca2a5f07c)
运算结果:
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/77_04.jpg?sign=1739552947-gLgk1vU76qV7JMlvatKejyL6hBtQR31m-0-61d14022273fbcb92b9a81ba8f7c3955)
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=1739552947-XSdHXkFQjhm362Kd6w0Hr6YwmgzL6xmy-0-85690f85b24c82ed5c656778dec34a0a)
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/78_01.jpg?sign=1739552947-671vKDp9TowgDHgH8x3wRLUG2HDy7K6y-0-fe6f6f0ace48d4f084dad71018d32eaf)
运算结果:
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/78_02.jpg?sign=1739552947-mRSPQTKouCziiRHBo9mqask8FThEdvZR-0-4a958ba5a2c0574855e8d6719014da6c)
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=1739552947-N4Bxm8mJXG1M10gtVYAbzTo3vi52YOUE-0-48a8e8516d8ab68351c49d3f96ab5702)
2-8 获取字典中的特定数据
【例2-53】 获取字典中的键、值及键值对数据。
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/78_04.jpg?sign=1739552947-1pB2MsDmUvSsimJYDvAqlyLZ05RLp1AH-0-1c6e840fc0ad080648053345e2bd1fce)
运算结果:
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/78_05.jpg?sign=1739552947-mJeF0RVlplny4CECnZSMraYZZ93ahcu4-0-05af3cc8e0c71e9ba03d6c4497921312)
从例中可以发现,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=1739552947-PSYy7j2EOfwhixBhfG2i5zq3VzNIMzBg-0-34cff585b09d14f7f930cc676c66364f)
运算结果:
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/79_01.jpg?sign=1739552947-9ProsODScOoW2Zayif7k6NXix8JcXDQq-0-92927a6fc72d1cf8c1c923bce92d5e00)
8.copy()方法
copy()方法是返回一个字典的副本,即返回一个具有相同键值对的新字典。
【例2-55】 字典的copy()方法应用。
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/79_02.jpg?sign=1739552947-PnuGMk2P063NdCOOPWL5IhS5UDscqDqT-0-62af58f4ef35e5d20076d10f01ca5c06)
运算结果:
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/79_03.jpg?sign=1739552947-liUukkduZrmVJyhKpaJPU3OZLIT5ePrS-0-7f590711565bdcf5535fdd41818e0ead)
从运行结果不难看出,对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=1739552947-2skyZ2lTQCYyJNI8ezw3tSjHityPz1Jy-0-0e92184c5150ec3c2d37f5e783b7522a)
运算结果:
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/80_02.jpg?sign=1739552947-d1k5SYBCoHB7kCQZjAClgHsWE20reG0C-0-c10f432a94a5ccdb1a940d0363ec6150)
从运行结果可以看出,由于被更新的字典中已包含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=1739552947-lYDa4XXJxD7jtDinvd8jM5sZo5A1ZtJF-0-81ad9e784e55a96c1ecc6744d7e331d9)
其中,dictname表示字典名称,key表示键。
【例2-57】 指定删除或随机删除。
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/80_04.jpg?sign=1739552947-26jRuXsYSd7pFEDFG7jHhl8P2TtuAmUo-0-2d834148777606609610cec77946d846)
运算结果:
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/80_05.jpg?sign=1739552947-eSTFDUYCCWlGNNepFQXAF8vgVGcOhDzz-0-a8a16b7be5772d4eae4b5b37ef9cdc50)
11.setdefault()方法
setdefault()方法用来返回某个key对应的value,其语法格式如下:
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/80_06.jpg?sign=1739552947-PryFMUq4moks1VtNaDepYZMb34BKZTxN-0-9a37a0622bd24653c3822afd18079b30)
说明,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=1739552947-vPqiH915nhxzKYkGSeWJYAAUn08VDTOx-0-3ab92a7670af058a39e0ac68d2ae941a)
运算结果:
![](https://epubservercos.yuewen.com/F38A38/21511156801516706/epubprivate/OEBPS/Images/81_02.jpg?sign=1739552947-QWO2K6L7s4S9p6dSbTQUd4YQsFqZ1CpC-0-10be0bd0fcbb3f7218c8ad029336c79a)
从例中可以看出,key为“'石化'”存在时,直接返回该key对应的value,即0.7,而不会更改为setdefault()方法中的0.68。