![Python王者归来](https://wfqqreader-1252317822.image.myqcloud.com/cover/412/31794412/b_31794412.jpg)
9-1 字典基本操作
9-1-1 定义字典
字典也是一个列表型的数据结构,但是它的元素是用“键-值”方式配对存储,在操作时是用键(key)取得值(value)的内容。定义字典时,是将键-值放在大括号“{ }”内,字典的语法格式如下:
name_dict = { 键1:值1, … , 键n:值n } # name_dict是字典变量名称
字典的值(value)可以是任何Python的对象,所以可以是数值、字符串、列表等。
程序实例ch9_1.py:以水果行和面店为例定义一个字典,同时列出字典。下列字典是设定水果一斤的价格、面一碗的价格,最后使用type( )列出字典数据类型。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P112_56251.jpg?sign=1739687505-2bR1sHXvw4vllPkF7rfOdHdEUG0gnbxA-0-c314a9d68811b2eaf560190cc15dbe0d)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P112_56257.jpg?sign=1739687505-vy0WG888X4n6OrwAtG6RqWgjhH3ZXIhV-0-04c85279aabe092d34608f5003ebe32d)
在使用Python设计打斗游戏时,玩家通常扮演英雄的角色,敌军可以用字典方式存储,例如,可以用不同颜色的标记设定敌军的小兵,每一个敌军的小兵给予一个分数,这样可以由打死敌军数量再统计游戏得分,可以用下列方式定义字典内容。
程序实例ch9_2.py:定义soldier0字典tag和score是键,red和3是值。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P112_56260.jpg?sign=1739687505-tuIhSN2r59EQR5mC8ImVRSM6qoIjtXZb-0-57561a254197a7bdaa173e72c623439a)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P112_56266.jpg?sign=1739687505-nXg0wrblOSFjU7Dor39nJs9UpXFOPna9-0-8263c72370cf38c0213f1399d4db8542)
上述是定义红色(red)小兵,分数是3分,玩家打死红色小兵得3分。
9-1-2 列出字典元素的值
字典的元素是“键-值”配对设定,如果想要取得元素的值,可以将键当作是索引方式处理,因此字典内的元素不可有重复的键,可参考下列实例ch9_3.py的第4行,例如,下列可传回fruits字典水蜜桃键的值。
fruits[‘水蜜桃'] # 用字典变量[‘键']取得值
下列是完整实例。
程序实例ch9_3.py:分别列出ch9_1.py中水果店水蜜桃一斤的价格和面店牛肉面一碗的价格。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P113_56686.jpg?sign=1739687505-OAf6PvcLusa5riwiWWvlE0IkgAEn3zYu-0-0ba854a23097914c74a4396765681db4)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P113_56692.jpg?sign=1739687505-IxbM2DcuG7m7J8Z0srdWCu2c8Potoxl3-0-d672156818e6a885d5de5bd7256253ba)
程序实例ch9_4.py:分别列出ch9_2.py小兵字典的tag和score键的值。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P113_56695.jpg?sign=1739687505-hc4kVrgHnXBYAS5ipO0JriTdxVYeHu9G-0-60f643b711ea0e1dc77ffd67264db8fe)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P113_56701.jpg?sign=1739687505-k7udWyeMDZeCaxXpNkwI824ps7Su5raJ-0-8a7de808784d3377ca9e64feeeb05c5a)
9-1-3 增加字典元素
可使用下列语法格式增加字典元素:
name_dict[键] = 值# name_dict是字典变量
程序设计ch9_5.py:为fruits字典增加橘子一斤18元。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P113_56705.jpg?sign=1739687505-WGjPpolLgkyiGJMyeEZ2ja9A6l4AYdfa-0-f6eefb6d86467268610f1ba5dbb5b069)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P113_56711.jpg?sign=1739687505-emOMT1jbaQyYSFCtnNUgA0P1kzFwcHWV-0-e30b4954f8183b8d4044266bd81aa9c9)
在设计打斗游戏时,我们可以使用屏幕坐标标记小兵的位置,下列实例是用xpos/ypos标记小兵的x坐标/y坐标。
程序实例ch9_6.py:为soldier0字典增加x,y轴坐标(xpos,ypos)和移动速度(speed)元素,同时列出结果做验证。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P113_56714.jpg?sign=1739687505-NpQQv2rMv41fxMvHmLoaWpd3rEsXH5JL-0-5e8cdd721dfc8aee0b1a7b8d24a25e9d)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P113_56720.jpg?sign=1739687505-RQzzGb4OF0cPcJL4ugxNwcPkm0uabsVd-0-f1d4158b9d370b9c4cc43b93fe99e7f2)
9-1-4 更改字典元素内容
市面上的水果价格是浮动的,如果发生价格异动可以使用本节观念更改。
程序实例ch9_7.py:将fruits字典的香蕉一斤改成12元。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P114_57121.jpg?sign=1739687505-DJTnqTljNoG7dele4EferznULtHnkvkZ-0-76bc4171e79738f8608b24fa812a05b9)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P114_57127.jpg?sign=1739687505-5VG7w5o2UeBIlPLyqrQFGuprvwLBfdib-0-5704f95ac52dde8a2aeb3265cd025036)
在设计打斗游戏时,我们需要时刻移动小兵的位置,此时可以使用本节介绍的方法来更改小兵位置。
程序实例ch9_8.py:依照soldier字典speed键的值移动小兵位置。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P114_57130.jpg?sign=1739687505-fhSGhVADeYmubueIKbupwcyJ9GyYTFXu-0-3eb789ac3978b12ffd104523a2921ad7)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P114_57136.jpg?sign=1739687505-X4bgpmVH7SKe0CyB4dxWSN2zcGNGw8vY-0-9ee32596db67ca19d6285d4372640419)
上述程序将小兵移动速度分成3个等级,slow是每次xpos移动1单位(5和6行),medium是每次xpos移动3单位(7和8行),另一等级则是每次xpos移动5单位(9和10行)。第11行是执行小兵移动,为了简化条件y轴暂不移动。所以可以得到上述小兵x轴位置由100移到101。
9-1-5 删除字典特定元素
如果想要删除字典的特定元素,它的语法格式如下:
del name_dict[键] # 可删除特定键的元素
程序实例ch9_9.py:删除fruits字典的西瓜元素。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P114_57141.jpg?sign=1739687505-wfrrG91A72cUi07EQ8v34suURFyTRs44-0-8f93507a9d6116eefe16ec117aac1da4)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P114_57147.jpg?sign=1739687505-6CGUpjwAwqPw1mx187RVHtUK95c4l7zX-0-6153719dece541baa4272192594f35d3)
9-1-6 删除字典所有元素
Python有提供方法clear( )可以将字典的所有元素删除,此时字典仍然存在,不过将变成空的字典。
程序实例ch9_10.py:使用clear( )方法删除fruits字典的所有元素。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P115_57550.jpg?sign=1739687505-XS4iRJUZ6PKAZs9k4E6kC7JKmZZY4oQl-0-ee411d75f64a26fcebf0bb738ca2cce4)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P115_57556.jpg?sign=1739687505-smr7sLTg0EwzBpAItroxzLrO8pKvq1PG-0-0484a118bfdee87e7ce4f216056a9c64)
9-1-7 删除字典
Python也有提供del指令可以将整个字典删除,字典一经删除就不再存在。它的语法格式如下:
del name_dict# 可删除字典name_dict
程序实例ch9_11.py:删除字典的测试,这个程序前4行是没有任何问题,第5行尝试打印已经被删除了的字典,所以产生错误,错误原因是没有定义fruits字典。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P115_57560.jpg?sign=1739687505-gbkXXUK1RQEh0beCLqKZTQZQT2AH6BRe-0-42d3578bfc8e0fc3a952d6bc47c20c71)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P115_57566.jpg?sign=1739687505-WhohkkqOWSCiFSBDXFZ5krj0OJb1Px1l-0-096b2ec8f4efddd209c01078e61d562b)
9-1-8 建立一个空字典
在程序设计时,也允许先建立一个空字典,建立空字典的语法如下:
name_dict = { }# name_dict是字典名称
上述建立完成后,可以用9-1-3节增加字典元素的方式为空字典建立元素。
程序实例ch9_12.py:建立一个小兵的空字典,然后为小兵建立元素。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P115_57570.jpg?sign=1739687505-a2pIvCzWtl2o3LUz3YjCi5oRrJRucilD-0-27d927b125ec5c2d5ae2bc8154dabf09)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P115_57576.jpg?sign=1739687505-IIwYh0PqHh1w8KT3wBHQbaSRkNdSf77b-0-d79340aa4d55f024af792133f35ea0d5)
9-1-9 字典的复制
在大型程序开发过程,有时为了要保护原先字典内容,所以常会需要将字典复制,此时可以使用此方法。
new_dict = name_dict.copy( )# name_dict会被复制至new_dict
上述所复制的字典是独立存在新地址的字典。
程序实例ch9_13.py:复制字典的应用,同时列出新字典所在地址,如此可以验证新字典与旧字典是不同的字典。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P116_57985.jpg?sign=1739687505-TkkaYenxEP8055eP8sBP6BmrkdqPOPnM-0-15c0364bb934e6f1dae034eaddbbb6cd)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P116_57991.jpg?sign=1739687505-PfDorXB6ANJ2DcvG9lc3XN3V61V5G3mE-0-a19a2e89f3411ffb6f1163107ae6876c)
9-1-10 取得字典元素数量
在列表(list)或元组(tuple)使用的方法len( )也可以应用在字典,它的语法如下:
length = len(name_dict)# 将返回name_dict字典的元素数量给length
程序实例ch9_14.py:列出空字典和一般字典的元素数量,本程序第4行由于是建立空字典,所以第7行印出元素数量是0。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P116_57995.jpg?sign=1739687505-FJhzA1Fvx9ImM0RkRNucCu5LxjsqXzBR-0-00f6736cbbb83f6ddfb144e636eaa883)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P116_58001.jpg?sign=1739687505-BRKhUTjTkDrueNOxlI26VPWNkjpqpXKy-0-6591f3fef154fefc5eb133046dfc3e6d)
9-1-11 验证元素是否存在
可以用下列语法验证元素是否存在。
键 in name_dict# 可验证键元素是否存在
程序实例ch9_15.py:这个程序会要求输入键-值,然后判断此元素是否在fruits字典,如果不在此字典则将此键-值加入字典。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P116_58005.jpg?sign=1739687505-JTWHCX3fMTdkk9E08jo7eP5AXtYz1S9a-0-fc783c884dac20a3847cdf2d16b38917)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P117_58415.jpg?sign=1739687505-KOnfZLuReUwOSigtrmOj9SGFqsvqKglE-0-7cb4dd286fe2b5c536e4a13e6788d509)
9-1-12 设计字典的可读性技巧
设计大型程序时,字典的元素内容很可能是由长字符串所组成,碰上这类情况建议从新的一行开始安置每一个元素,如此可以大大增加字典内容的可读性。例如,有一个players字典,元素是由键(球员名字)-值(球队名称)所组成。如果,我们使用传统方式设计,将让整个字典定义变得很复杂,如下所示:
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P117_58419.jpg?sign=1739687505-QIy81vrnRsY1qs4aYR7zasu0J4cu2h4p-0-a4b32856098f82921c2a44177cb591f5)
碰上这类字典,建议是一行定义一个元素,如下所示:
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P117_58422.jpg?sign=1739687505-jNuKFpfG9PTPi0ba4n5pTwTMV5z0Rek9-0-50a8d9ed3000ab9ec289db76b166d6b2)
程序实例ch9_16.py:字典元素是长字符串的应用。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P117_58425.jpg?sign=1739687505-13edRFx0vxtKj8BXj0RlRVdXsIBveDmd-0-998be67a7199addd187caabc2eb889ad)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P117_58431.jpg?sign=1739687505-miZzf64WeNvfAjdZwOKi63iudc1wfAK0-0-3a1c2246e1992a20092843d729773753)