从零开始学Python第13课:常用数据结构之字典
迄今为止,我们已经为大家介绍了Python中的三种容器型数据类型(列表、元组、集合),但是这些数据类型仍然不足以帮助我们解决所有的问题。例如,我们需要一个变量来保存一个人的多项信息,包括:姓名、年龄、身高、体重、家庭住址、本人手机号、紧急联系人手机号,此时你会发现,我们之前学过的列表、元组和集合类型都不够好使。
person1 = ['王大锤', 55, 168, 60, '成都市武侯区科华北路62号1栋101', '13122334455', '13800998877']
person2 = ('王大锤', 55, 168, 60, '成都市武侯区科华北路62号1栋101', '13122334455', '13800998877')
person3 = {'王大锤', 55, 168, 60, '成都市武侯区科华北路62号1栋101', '13122334455', '13800998877'}
集合肯定是最不合适的,因为集合中不能有重复元素,如果一个人的年龄和体重刚好相同,那么集合中就会少一项信息;同理,如果这个人的手机号和紧急联系人手机号是相同的,那么集合中又会少一项信息。另一方面,虽然列表和元组可以把一个人的所有信息都保存下来,但是当你想要获取这个人的手机号或家庭住址时,你得先知道他的手机号是列表或元组中的第几个元素。总之,在遇到上述的场景时,列表、元组、集合都不是最合适的选择,此时我们需要字典(dictionary)类型,这种数据类型最适合把相关联的信息组装到一起,可以帮助我们解决 Python 程序中为真实事物建模的问题。
说到字典这个词,大家一定不陌生,读小学的时候,每个人手头基本上都有一本《新华字典》,如下图所示。
Python 程序中的字典跟现实生活中的字典很像,它以键值对(键和值的组合)的方式把数据组织到一起,我们可以通过键找到与之对应的值并进行操作。就像《新华字典》中,每个字(键)都有与它对应的解释(值)一样,每个字和它的解释合在一起就是字典中的一个条目,而字典中通常包含了很多个这样的条目。
创建和使用字典
Python 中创建字典可以使用{}
字面量语法,这一点跟上一节课讲的集合是一样的。但是字典的{}
中的元素是以键值对的形式存在的,每个元素由:
分隔的两个值构成,:
前面是键,:
后面是值,代码如下所示。
xinhua = {'麓': '山脚下','路': '道,往来通行的地方;方面,地区:南~货,外~货;种类:他俩是一~人','蕗': '甘草的别名','潞': '潞水,水名,即今山西省的浊漳河;潞江,水名,即云南省的怒江'
}
print(xinhua)
person = {'name': '王大锤','age': 55,'height': 168,'weight': 60,'addr': '成都市武侯区科华北路62号1栋101', 'tel': '13122334455','emergence contact': '13800998877'
}
print(person)
通过上面的代码,相信大家已经看出来了,用字典来保存一个人的信息远远优于使用列表或元组,因为我们可以用:
前面的键来表示条目的含义,而:
后面就是这个条目所对应的值。
当然,如果愿意,我们也可以使用内置函数dict
或者是字典的生成式语法来创建字典,代码如下所示。
# dict函数(构造器)中的每一组参数就是字典中的一组键值对
person = dict(name='王大锤', age=55, height=168, weight=60, addr='成都市武侯区科华北路62号1栋101')
print(person) # {'name': '王大锤', 'age': 55, 'height': 168, 'weight': 60, 'addr': '成都市武侯区科华北路62号1栋101'}# 可以通过Python内置函数zip压缩两个序列并创建字典
items1 = dict(zip('ABCDE', '12345'))
print(items1) # {'A': '1', 'B': '2', 'C': '3', 'D': '4', 'E': '5'}
items2 = dict(zip('ABCDE', range(1, 10)))
print(items2) # {'A': 1, 'B': 2, 'C': 3, 'D': 4, 'E': 5}# 用字典生成式语法创建字典
items3 = {x: x ** 3 for x in range(1, 6)}
print(items3) # {1: 1, 2: 8, 3: 27, 4: 64, 5: 125}
想知道字典中一共有多少组键值对,仍然是使用len
函数;如果想对字典进行遍历,可以用for
循环,但是需要注意,for
循环只是对字典的键进行了遍历,不过没关系,在学习了字典的索引运算后,我们可以通过字典的键获取到和这个键对应的值。
person = {'name': '王大锤', 'age': 55, 'height': 168, 'weight': 60, 'addr': '成都市武侯区科华北路62号1栋101'}
print(len(person)) # 5
for key in person:print(key)
字典的运算
对于字典类型来说,成员运算和索引运算肯定是很重要的,前者可以判定指定的键在不在字典中,后者可以通过键获取对应的值或者向字典中添加新的键值对。值得注意的是,字典的索引不同于列表的索引,列表中的元素因为有属于自己有序号,所以列表的索引是一个整数;字典中因为保存的是键值对,所以字典需要用键去索引对应的值。需要特别提醒大家注意的是,字典中的键必须是不可变类型,例如整数(int
)、浮点数(float
)、字符串(str
)、元组(tuple
)等类型,这一点跟集合类型对元素的要求是一样的;很显然,之前我们讲的列表(list
)和集合(set
)不能作为字典中的键,字典类型本身也不能再作为字典中的键,因为字典也是可变类型,但是字典可以作为字典中的值。大家可以先看看下面的代码,了解一下字典的成员运算和索引运算。
person = {'name': '王大锤', 'age': 55, 'height': 168, 'weight': 60, 'addr': '成都市武侯区科华北路62号1栋101'}# 成员运算
print('name' in person) # True
print('tel' in person) # False# 索引运算
print(person['name'])
print(person['addr'])
person['age'] = 25
person['height'] = 178
person['tel'] = '13122334455'
person['signature'] = '你的男朋友是一个盖世垃圾,他会踏着五彩祥云去迎娶你的闺蜜'
print(person)# 循环遍历
for key in person:print(f'{key}:\t{person[key]}')
需要注意,在通过索引运算获取字典中的值时,如指定的键没有在字典中,将会引发KeyError
异常。
字典的方法
字典类型的方法基本上都跟字典的键值对操作相关,其中get
方法可以通过键来获取对应的值。跟索引运算不同的是,get
方法在字典中没有指定的键时不会产生异常,而是返回None
或指定的默认值,代码如下所示。
person = {'name': '王大锤', 'age': 25, 'height': 178, 'addr': '成都市武侯区科华北路62号1栋101'}
print(person.get('name')) # 王大锤
print(person.get('sex')) # None
print(person.get('sex', True)) # True
如果需要获取字典中所有的键,可以使用keys
方法;如果需要获取字典中所有的值,可以使用values
方法。字典还有一个名为items
的方法,它会将键和值组装成二元组,通过该方法来遍历字典中的元素也是非常方便的。
person = {'name': '王大锤', 'age': 25, 'height': 178}
print(person.keys()) # dict_keys(['name', 'age', 'height'])
print(person.values()) # dict_values(['王大锤', 25, 178])
print(person.items()) # dict_items([('name', '王大锤'), ('age', 25), ('height', 178)])
for key, value in person.items():print(f'{key}:\t{value}')
字典的update
方法会用一个字典更新另一个字典中的键值对。例如,有两个字典x
和y
,当执行x.update(y)
操作时,x
跟y
相同的键对应的值会y
中的值被更新,而y
中有但x
中没有的键值对会直接添加到x
中,代码如下所示。
person1 = {'name': '王大锤', 'age': 55, 'height': 178}
person2 = {'age': 25, 'addr': '成都市武侯区科华北路62号1栋101'}
person1.update(person2)
print(person1) # {'name': '王大锤', 'age': 25, 'height': 178, 'addr': '成都市武侯区科华北路62号1栋101'}
可以通过pop
或popitem
方法从字典中删除元素,前者会返回键对应的值,但是如果字典中不存在指定的键,会引发KeyError
错误;后者在删除元素时,会返回键和值组成的二元组。字典的clear
方法会清空字典中所有的键值对,代码如下所示。
person = {'name': '王大锤', 'age': 25, 'height': 178, 'addr': '成都市武侯区科华北路62号1栋101'}
print(person.pop('age')) # 25
print(person) # {'name': '王大锤', 'height': 178, 'addr': '成都市武侯区科华北路62号1栋101'}
print(person.popitem()) # ('addr', '成都市武侯区科华北路62号1栋101')
print(person) # {'name': '王大锤', 'height': 178}
person.clear()
print(person) # {}
跟列表一样,从字典中删除元素也可以使用del
关键字,在删除元素的时候如果指定的键索引不到对应的值,一样会引发KeyError
错误,具体的做法如下所示。
person = {'name': '王大锤', 'age': 25, 'height': 178, 'addr': '成都市武侯区科华北路62号1栋101'}
del person['age']
del person['addr']
print(person) # {'name': '王大锤', 'height': 178}
字典的应用
我们通过几个简单的例子来看看如何使用字典类型解决一些实际的问题。
例子1:输入一段话,统计每个英文字母出现的次数,按出现次数从高到低输出。
sentence = input('请输入一段话: ')
counter = {}
for ch in sentence:if 'A' <= ch <= 'Z' or 'a' <= ch <= 'z':counter[ch] = counter.get(ch, 0) + 1
sorted_keys = sorted(counter, key=counter.get, reverse=True)
for key in sorted_keys:print(f'{key} 出现了 {counter[key]} 次.')
输入:
Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure.
输出:
e 出现了 27 次.
n 出现了 21 次.
a 出现了 18 次.
i 出现了 18 次.
s 出现了 16 次.
t 出现了 16 次.
o 出现了 14 次.
h 出现了 13 次.
r 出现了 10 次.
d 出现了 9 次.
l 出现了 9 次.
g 出现了 6 次.
u 出现了 6 次.
f 出现了 6 次.
c 出现了 6 次.
y 出现了 5 次.
b 出现了 5 次.
m 出现了 4 次.
p 出现了 3 次.
w 出现了 2 次.
v 出现了 2 次.
M 出现了 1 次.
k 出现了 1 次.
x 出现了 1 次.
例子2:在一个字典中保存了股票的代码和价格,找出股价大于100元的股票并创建一个新的字典。
说明:可以用字典的生成式语法来创建这个新字典。
stocks = {'AAPL': 191.88,'GOOG': 1186.96,'IBM': 149.24,'ORCL': 48.44,'ACN': 166.89,'FB': 208.09,'SYMC': 21.29
}
stocks2 = {key: value for key, value in stocks.items() if value > 100}
print(stocks2)
输出:
{'AAPL': 191.88, 'GOOG': 1186.96, 'IBM': 149.24, 'ACN': 166.89, 'FB': 208.09}
总结
Python 程序中的字典跟现实生活中字典非常像,允许我们以键值对的形式保存数据,再通过键索引对应的值。这是一种非常有利于数据检索的数据类型。再次提醒大家注意,字典中的键必须是不可变类型,字典中的值可以是任意类型。
从零开始学Python第13课:常用数据结构之字典相关推荐
- python画直方图-从零开始学Python【13】--matplotlib(直方图)
# 导入第三方包 importnumpy asnp importpandas aspd importmatplotlib.pyplot asplt importmatplotlib.mlab asml ...
- python集合运算_从零开始学Python - 第014课:常用数据结构之集合
在学习了列表和元组之后,我们再来学习一种容器型的数据类型,它的名字叫集合(set).说到集合这个词大家一定不会陌生,在数学课本上就有这个概念.通常我们对集合的定义是"把一定范围的.确定的.可 ...
- 学python处理数据结构_从零开始学Python - 第009课:常用数据结构之字符串
第二次世界大战促使了现代电子计算机的诞生,世界上的第一台通用电子计算机叫ENIAC(电子数值积分计算机),诞生于美国的宾夕法尼亚大学,占地167平米,重量27吨,每秒钟大约能够完成约5000次浮点运算 ...
- 从零开始学Python第05课:分支结构
迄今为止,我们写的 Python 代码都是一条一条语句按顺序向下执行的,这种代码结构叫做顺序结构.然而仅有顺序结构并不能解决所有的问题,比如我们设计一个游戏,游戏第一关的过关条件是玩家获得1000分, ...
- python从零开始进阶_从零开始学Python - 第020课:函数使用进阶
在之前的课程中,我们讲到过关于函数的知识,我们还讲到过Python中常用的数据类型,这些类型的变量都可以作为函数的参数或返回值:通过前几节课的学习,我们又知道了写在类中的函数通常称之为方法,它代表了类 ...
- python 窗口程序开发课程_从零开始学Python - 第019课:使用PyCharm开发Python应用程序...
坚持学习完前18课的小伙伴应该已经感受到了,随着我们对Python语言的认知在逐步加深,我们写的代码也越来越复杂了."工欲善其事,必先利其器",如果希望能够更快更好的写出代码,选择 ...
- 包和模块_月隐学python第13课
目录 1.⽣成器 1.1 yield表达式 2.迭代器 2.1 迭代对象 2.2 迭代器 2.3 将迭代对象转换为迭代器 3. 包 4.模块 4.1 模块搜索路径 4.2 导⼊模块 1.⽣成器 如 ...
- for循环中取出最大最小 累加_从零开始学Python - 第006课:循环结构
应用场景 我们在写程序的时候,一定会遇到需要重复执行某条或某些指令的场景.例如用程序控制机器人踢足球,如果机器人持球而且还没有进入射门范围,那么我们就要一直发出让机器人向球门方向移动的指令.在这个场景 ...
- Python 程序 可以一直输入 quit_从零开始学Python - 第002课:第一个Python程序
在上一课中,我们已经了解了Python这门语言并安装了运行Python程序所需的环境,相信大家已经迫不及待的想开始自己的Python编程之旅了.首先我们来告诉大家在哪些地方可以写Python程序. 编 ...
最新文章
- 学习之模块架构 DotNetNuke 6
- 针对校园某服务器的一次渗透测试
- 招聘、招聘,我就这样被算法选中
- ThreatARMOR添加零日恶意软件防御功能
- k-java游戏下载,KEmulator(JAVA手机游戏模拟器)
- 推荐算法-GBDT与LR算法融合
- 基于PHP的汉服文化交流平台 毕业设计-附源码240903
- beetl html模板,Beetl模板引擎之自定义html标签
- 企业IT规划方法建议
- 苹果手机回收价格怎么查询
- CuPy is not correctly installed
- 你知道java中重载和重写的区别吗?(详细解说)
- NAND Flash硬件原理
- 北京国际康培计算机技术学校,2019年IB统考成绩最新汇总,北京哪所国际学校分数最高?...
- 屡陷丑闻的 Facebook,试图靠 AI Bot 管住员工的嘴
- CS61A Lab 4
- 2.使用Gateway实现token校验
- Python 网络爬虫:Selenium 好买基金网
- 通过 Git 将代码提交到 GitHub(上)
- 超详细的golang学习指南,golang知识图谱