![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=1738839555-rmhnJvf5uxTSUYneVB17eUnGinxRF5PG-0-8d5b21a460663128f8d85deeff6a80aa)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P112_56257.jpg?sign=1738839555-HZhWRmDVkZPO0br9H4otWm4BZHUzKKCY-0-157420cc4ebeef3b9552ffde8b41a386)
在使用Python设计打斗游戏时,玩家通常扮演英雄的角色,敌军可以用字典方式存储,例如,可以用不同颜色的标记设定敌军的小兵,每一个敌军的小兵给予一个分数,这样可以由打死敌军数量再统计游戏得分,可以用下列方式定义字典内容。
程序实例ch9_2.py:定义soldier0字典tag和score是键,red和3是值。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P112_56260.jpg?sign=1738839555-uebGQdKDJHU0p9RdFAF6BmEtCBl89wj5-0-f83ab4c9b48ed3555b2dcff58e8f7bb3)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P112_56266.jpg?sign=1738839555-D6JpV0PwGNzT5eg3aNvw8hFruFi5Ydww-0-c8cd0307b6853eefa2ecba5638dd9761)
上述是定义红色(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=1738839555-1HXf5Ncqllv6nE15pWxXImlSK0Ye4FbL-0-34f646626eb62ee69d5137420714411c)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P113_56692.jpg?sign=1738839555-NSUU0hWCag9hWuo1k49Sb1vaVdyuQyf0-0-b89c5083f9615c9499a7020df9727991)
程序实例ch9_4.py:分别列出ch9_2.py小兵字典的tag和score键的值。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P113_56695.jpg?sign=1738839555-shtwUKJ78lD3INQPWg3VuYzS2cvqZ56c-0-177fed84f09791b3ba0b7eea8133203a)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P113_56701.jpg?sign=1738839555-XCeZYZNLF64nXJ5GoosayrhE4ORhLFx2-0-1acf4faf567421e7874877c61c8aa7cb)
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=1738839555-W2x9TcljhkFypWuUZYxQ6fq3dazgbynV-0-b27b77c90b988ef4dee603e9bb6eb37b)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P113_56711.jpg?sign=1738839555-SNPMNfSHkhuxmDKC7JPAkWLkyVUqICEf-0-092a8595cc1d1d16015b0ec49785d533)
在设计打斗游戏时,我们可以使用屏幕坐标标记小兵的位置,下列实例是用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=1738839555-LMQj0wWEdBgrG9HLflfNza2YsAoKkP5I-0-9429c8020020c18d3831fe8c387664e9)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P113_56720.jpg?sign=1738839555-Ig1C4Faexp3lcW4zLWpt4bADQVVc6GRY-0-c5c6758783802dcf1b1b413423c7c0ee)
9-1-4 更改字典元素内容
市面上的水果价格是浮动的,如果发生价格异动可以使用本节观念更改。
程序实例ch9_7.py:将fruits字典的香蕉一斤改成12元。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P114_57121.jpg?sign=1738839555-JbmaKntL8zLBakQ2ABJC0bTD20qdhZ96-0-bc39d4db3340dc847f08dea893411f83)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P114_57127.jpg?sign=1738839555-iSXLDiqgoTjKbldiOnhwQIHJ0dunWoFB-0-dd3258c1d9db326b43b19688647cbc33)
在设计打斗游戏时,我们需要时刻移动小兵的位置,此时可以使用本节介绍的方法来更改小兵位置。
程序实例ch9_8.py:依照soldier字典speed键的值移动小兵位置。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P114_57130.jpg?sign=1738839555-T2aAClysqgvSm1P5ciT7NMtX5VEYE2l9-0-a774680deaf380961512cc15c25e38c8)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P114_57136.jpg?sign=1738839555-qMh44LzYQs6ceAheZIjniPLnYn7XVj2h-0-e979f250a75adb23e9c7c9057b090235)
上述程序将小兵移动速度分成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=1738839555-bF7GwoNjxIurRccWxq1v4tXFsuCntKsB-0-fe0b16a680a9657ea13b7a500b3d67bd)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P114_57147.jpg?sign=1738839555-4FEjU7ZgkV8WTbnK1eugITpEDuvX0v6J-0-a87f14095c7ad3bfa41822579caf6ada)
9-1-6 删除字典所有元素
Python有提供方法clear( )可以将字典的所有元素删除,此时字典仍然存在,不过将变成空的字典。
程序实例ch9_10.py:使用clear( )方法删除fruits字典的所有元素。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P115_57550.jpg?sign=1738839555-XQXt3N76IF5nWue88tyJNRi1pByyhhLk-0-663c0f843188f6fcae8df095bbfc6b8d)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P115_57556.jpg?sign=1738839555-hKkc9xMsMPGyltxkHP1P76LcdvrPhx0z-0-41fac88d05c32dd4b759c36d572181dc)
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=1738839555-nyb7Rw3BFCAcz6RaCjdVwR5S0LtUgf1H-0-ed6244027f31eccb66a786ed790e1708)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P115_57566.jpg?sign=1738839555-R2pYlHXkVJ4cw8cVHhRlhblqSYXmuSN0-0-1fde94970012b66274dbe6bbb0b85576)
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=1738839555-U5FpMyFolt5ydKT8qSEuqSaJgVTPuXAc-0-53b738e03d46df22f3a535fc38138835)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P115_57576.jpg?sign=1738839555-XGvn20EdN5ILIPrMjhjfVaCIZ7ypabsz-0-0ea8b9592f82f4e63ce250a2ac424342)
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=1738839555-wqWILAjypYBrrekFzhqhavTfe3hNKh47-0-65fd9280a48013558b745d707bf89ea6)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P116_57991.jpg?sign=1738839555-ljGcN7fsr9qQhxFtfTCk07U7Sma9SOBq-0-ab4521e0713a0d23c90056a7765148d1)
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=1738839555-KbkuiR1COxltHCApiNgIvErLojq9pJF6-0-5ec23c10912afcb2039b7ed4d5a82db1)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P116_58001.jpg?sign=1738839555-Y7wfdz8eki7iVlVLnEutfdQEPS7GNP27-0-eb6ba84c02b5533f2291f1bc2a57395f)
9-1-11 验证元素是否存在
可以用下列语法验证元素是否存在。
键 in name_dict# 可验证键元素是否存在
程序实例ch9_15.py:这个程序会要求输入键-值,然后判断此元素是否在fruits字典,如果不在此字典则将此键-值加入字典。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P116_58005.jpg?sign=1738839555-Ith3cCTSrjCwOJFkngCtfoHg97tvHVnd-0-6b97850ee661e2afc3f205b631da72a5)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P117_58415.jpg?sign=1738839555-UNJrOxCLqlhWHaZB7hhkL6Zn1fwdEKGU-0-ce4800bf85bae0ce5d8f4fd812c15894)
9-1-12 设计字典的可读性技巧
设计大型程序时,字典的元素内容很可能是由长字符串所组成,碰上这类情况建议从新的一行开始安置每一个元素,如此可以大大增加字典内容的可读性。例如,有一个players字典,元素是由键(球员名字)-值(球队名称)所组成。如果,我们使用传统方式设计,将让整个字典定义变得很复杂,如下所示:
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P117_58419.jpg?sign=1738839555-snjQJ0lTzDLSuTWh9VLZku96wq0OkqYm-0-32d576fc262d234324a2f6bc9ae521bf)
碰上这类字典,建议是一行定义一个元素,如下所示:
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P117_58422.jpg?sign=1738839555-xfLTtZlPWbr98wIf82ISQfZEtqBYjL4y-0-f34dc3afd09b20cc024c52d7381a8f51)
程序实例ch9_16.py:字典元素是长字符串的应用。
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P117_58425.jpg?sign=1738839555-t0tkoo3HUrvfdbllDNs5aTnVn79AEsmv-0-d3edada838b96d818dd36dbd4df93d2d)
执行结果
![](https://epubservercos.yuewen.com/6532E4/17214367404798806/epubprivate/OEBPS/Images/Figure-P117_58431.jpg?sign=1738839555-hYPGH90PHCYNcXHBIDoQsQjRt0v8iFxl-0-58127b4e1ce1ce6ee429c9f11cdace74)