前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >夯实Python基础(4)

夯实Python基础(4)

作者头像
高一峰
发布2020-09-22 09:58:50
5580
发布2020-09-22 09:58:50
举报
文章被收录于专栏:高渡号外高渡号外
夯实Python基础

四、字典

在《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)

当然,上面的这个代码仅用于演示如何使用字典数据,作为商业开发时的菜单程序一般不会这样写,功能上也会更符合使用的习惯。

有兴趣的同学,可以修改以上代码,写一个真正属于自己的三级联动菜单。

我相信,你能行!加油!!!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 高渡号外 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 四、字典
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档