在《Python入门》课程中,我们学习了Python的四大数据结构:列表、元组、字典和集合。其中,字典恐怕是相对最不好理解的和不太擅长运用的数据结构。
今天的课程,我们就来好好巩固一下有关字典的知识,并拓展一下运用技能。
(一)、基本概念
其实吧,说字典不好理解,主要是因为它的构成稍微复杂一点,大家都喜欢简单的东西,不费脑筋。
但是呢,有时候复杂一点的东西,更可以不费脑筋。此话怎讲呢?
这么说吧,很多不熟悉计算机硬件的同学面对拆散的一台电脑配件,肯定是很无语的,那就是一堆垃圾。但是,在电脑城的小哥眼里,就完全不一样了,几分钟的功夫,它就可以组装成一台完整的电脑。这件事情,大家应该还理解吧?不是因为电脑小哥有多厉害,对这些配件的每一块芯片或者集成电路的原理,其实,小哥心里也是迷茫的,但是,它们集成在一起以后成为一个部件,小哥就只需要知道那块东西是主板,那块东西是内存,那块东西是硬盘等等,他就能顺手把它组装成一台电脑了。所以,厉害的是那个集成芯片和电路构成一个部件的人,是他/他们让组装电脑这件事变得简单了。
回到咱们的数据结构上来,为什么说字典这种类型,比列表、元组和集合稍微复杂一点也有它的好处呢?比如,每个人都有一个身高,假如某个数据采集项目正好需要这样的一堆数据,一大堆人,成百、上千,或者上万,如果手头有一个名单,让大家分组按顺序去测量身高,完了再把每个人的ID和身高数据记录下来,如果,我们把ID保存在一个列表里,然后把身高也保存在一个列表里,显然,这两个列表的数据量是一致的,也是一一对应的。但是,万一某个列表的数据哪怕只挪动了一个,是不是数据就全乱了?
那么,好的解决方案,肯定是把ID和身高数据成对的记录在一起,这样,虽然单个数据记录复杂一点,但是,拿到一个就可以用了,每一个数据都是完整有效的。因为,我们把它做了一个最简单的“集成”,它不再是一个孤立的数据,而是一个有效的数据单元。这就像一个电脑部件,它变得拿来可用了,而我们无需介意它们为什么在一起?是否正确的组合?因为那是采集和记录数据的人应该做的正确的事。他们所建立的这种成对记录ID和身高的数据结构就是字典!
事实上,现实生活中,几乎一切事物都是关联的,有联系的数据也才有意义,所以我们面对的数据,大量都是以这种方式存在的。
学会使用字典,将使你在处理数据的时候如虎添翼!
1、定义字典
比如,上面的案例,如果有一组采集对象的ID分别是:1001、1002、1003、1004、1005,他们的身高测量分别是:172、169、180、178、183(米)。
那么,我们用字典就可以表示为:
{1001:172, 1002:169, 1003:180, 1004:178, 1005:183}
字典是记录具有映射关系的信息的一种数据结构。所谓映射关系,它是软件领域使用较多的一个词,现实生活中我们常常通俗称之为“一一对应关系”。称谓不重要,重要的是理解它的内涵,任何映射关系中永远存在着“一一对应”的状态,在Python中又把它称之为“键值对”关系(Key-Value),因为它的每一组数据,都是一个“键值对”。比如,上面的ID具有唯一性,它代表不同的测量对象(人),它就是键(Key),身高就是ID(Key)对应的值(Value)。
2、字典的特性
显然,在这种字典数据的映射关系中,键(Key)具有唯一性。想想看,如果它不具有唯一性,会出现什么情况?比如,上面的ID一旦有重复的情况出现,那么它对应的身高数据就无法知道它究竟是属于谁的身高了?对吧?!
这就是我们为什么没有用姓名来创建字典的键(Key)的原因。
3、字典的常用操作
(1)创建一个字典
>>> dict1 = {1001:172, 1002:169, 1003:180, 1004:178, 1005:183}
(2)读取字典数据
>>> dict1[1001]# 通过键获取对应的值
172
(3)添加字典数据
>>> dict1[1006:176]
>>> dict1
{1001:172, 1002:169, 1003:180, 1004:178, 1005:183, 1006:176}
(4)修改字典数据
>>> dict1[(1002:168)]
>>> dict1
{1001:172, 1002:168, 1003:180, 1004:178, 1005:183, 1006:176}
(5)其他数据类型转换为字典
>>> list1 = [(‘语文’,83),(‘数学’,98),(‘英语’,90)]
>>> dict2 = dict(list1)
>>> dict2
{‘语文’:83, ‘数学’:98, ‘英语’:90}
(6)get()方法:根据Key读取Value
>>> print(dict1.get(1003))
180
请注意,它跟dict1[1003]是不是获得了相同的结果?没错!但是,get()方法存在的价值在于,如果某个键不存在,比如dict1[1007],Python会报错,但是dict1.get(1007)不会报错,它返回给你的是none值。
(7)update()方法:把一个字典的数据追加到另一个字典
>>> dict3 = dict1.update(dict2)
>>> dict3
{1001:172, 1002:168, 1003:180, 1004:178, 1005:183, 1006:176,‘语文’:83, ‘数学’:98, ‘英语’:90}
需要注意的是:在执行 update() 方法时,如果被更新的字典中己包含对应的 key-value 对,那么原 value 会被覆盖;如果被更新的字典中不包含对应的 key-value 对,则该 key-value 对被添加进去。
(8)pop(key)方法:删除指定键的键值对,并返回指定的键的值
>>> dict1.pop(1006)
176
>>> dict1
{1001:172, 1002:169, 1003:180, 1004:178, 1005:183}
(9)clear()方法:用于清空字典的所有键值对
>>> dict2.clear()
>>> dict2
{}
(10)in关键:判断某键值对是否存在?返回True / False
>>> 1007 in dict1
False
(11)字典循环(注意两种的差别)
>>> info = {
'stu_1001':"Lan Wu",
'stu_1002':"Long Lou la",
'stu_1003':"Xiao Ze",
}
# 基本循环,效率高
for i in info:
print(i,info[i])
#这种循环稍显复杂,但结果易于阅读 for k,v in info.items(): print(k,v)
限于篇幅,字典还有其他一些常用方法,建议访问高渡网站,有大量的Python课程和微课资料供学习、阅读和查询。
(二)、字典的多级嵌套
Python的数据结构都是可以多级嵌套的,字典当然也可以,它因此可以让一个字典对象承载大量且复杂的数据信息。下面,我们来欣赏一下:
# 部分省市区的信息
province_city_area_dict = {
“湖北”:{
“武汉市”:['江岸区','江汉区','乔口区','汉阳区','武昌区','青山区','洪山区','东西湖区','汉南区','蔡甸区','江夏区','黄陂区','新洲区'],
“黄石市”:['黄石港区','西塞山区','下陆区','铁山区','阳新县','大冶市'],
“宜昌市”:['西陵区','伍家岗区','点军区','猇亭区','夷陵区','远安县','兴山县','秭归县','长阳土家族自治县','五峰土家族自治县','宜都市','当阳市','枝江市']
},
“湖南”:{
“长沙市”:['芙蓉区','天心区','岳麓区','开福区','雨花区','长沙县','望城县','宁乡县','浏阳市'],
“株洲市”:['荷塘区','芦淞区','石峰区','天元区','株洲县','攸 县','茶陵县','炎陵县','醴陵市'],
“湘潭市”:['雨湖区','岳塘区','湘潭县','湘乡市','韶山市']
},
“广东”:{
“广州市”:['东山区','荔湾区','越秀区','海珠区','天河区','芳村区','白云区','黄埔区','番禺区','花都区','增城市','从化市'],
“深圳市”:['罗湖区','福田区','南山区','宝安区','龙岗区','盐田区'],
“珠海市”:['香洲区','斗门区','金湾区']
}
}
代码解析:
我们看到部分省市区的信息,被创建在一个两层嵌套的字典里。
第一层:键(key)是省份,值(value)是对应该省的部分市和区的信息的一个字典。
第二层:键(key)是市名,值(value)是该市包含的区名的一个列表。
事实上,大家可以想象得到,包含全国的所有省市地区(县)的信息都可以用这样一个两层嵌套的字典来存储全部的数据信息。
OK,如果在程序中,有这样一个函数:
def my_function(a):
# 函数代码块(略)
我们需要把这个数据对象,传递给一个函数来参与其他更多数据的处理,那么,我们只需要像下面这样就搞定了:
my_function(province_city_area_dict)
是不是超级简单?
这就是我们刚开始说的,有时候复杂一点的东西,更可以不费脑筋。熟练运用字典,可以最大限度第降低我们写代码的复杂程度。
(三)、案例:一个三级联动菜单
下面这个案例,可以应用上面的字典数据,轻松创建一个三级联动的菜单。各位,最好将下面的代码手动敲到你的电脑里,打开Python Sell运行该代码就能立即体验到一个关于省、市、地区的三级联动菜单效果。
def city_menu(data):
for i in data:
print(i)
choie1 = input("你要选择的省份是:")
if choie1 in data:
for j in data[choie1]:
print(j)
choie2 = input("你要选择的城市是:")
if choie2 in data[choie1]:
for k in data[choie1][choie2]:
print(k)
choie3 = input("你要选择的地区/县是:")
if choie3 in data[choie1][choie2]:
print("你选择的地区是:"+choie1+"省"+choie2+choie3+"!")
else:
print("您输入有误!")
else:
print("您输入有误!")
else:
print("您输入有误!")
#调用函数
city_menu(province_city_area_dict)
当然,上面的这个代码仅用于演示如何使用字典数据,作为商业开发时的菜单程序一般不会这样写,功能上也会更符合使用的习惯。
有兴趣的同学,可以修改以上代码,写一个真正属于自己的三级联动菜单。
我相信,你能行!加油!!!