第九章 字典
学习要点
学习字典的基本概念和操作。
对标内容
创建字典、访问字典里的值、删除字典里的元素、修改字典。
情景导入
可以通过音序查字法查找到相应的字;如果我们只知道字的写法,但是不知道读音,可以通过部首查字法查找到相应的读音。大家有没有发现, 不管使用哪种查字法,都必须要有一个已知关键信息,通过这个关键信息可以找到对应的其他信息。这其实也是Python中字典的基本原理:通过键来找到值, 它们是对应的关系。
思考1: 如果有多个数据,例如:'Tom', '男', 20,如何快速存储?
答:列表
list1 = ['Tom', '男', 20]
思考2:如何查找到数据'Tom'?
答:查找到下标为0的数据即可。
list1[0]
思考3:如果将来数据顺序发生变化,如下所示,还能用list1[0]
访问到数据'Tom'吗?。
list1 = ['男', 20, 'Tom']
答:不能,数据'Tom'此时下标为2。
思考4:数据顺序发生变化,每个数据的下标也会随之变化,如何保证数据顺序变化前后能使用同一的标准查找数据呢?
答:字典,字典里面的数据是以键值对形式出现,字典数据和数据顺序没有关系,即字典不支持下标,后期无论数据如何变化,只需要按照对应的键的名字查找数据即可。
字典
什么是字典?
Python中的字典指的是一种可变的容器类型,而且它可以装任意类型对象。 所谓容器类型,就是可以存储数据的地方。Python中的字典是用大括号{}括起来的,并且每一个元素由键和值两部分组成,并且键和值之间必须使用英文冒号(:)隔开,由于它们必须一一对应出现,所以又称作键值对,每组键值对之间必须用英文逗号(,)隔开,如下例所示。
>>> d = {"西瓜":9.6,"桃子":2,"苹果":4}
字典有什么特征?
键是字典中进行读取值及赋值的很重要的标记,所以要求有唯一性,并且是不可变序列;值可以是其他任意数据类型,不要求具有唯一性。
字典并不是序列,所以没有顺序,因而也就没有索引。
字典的创建
字典直接使用{}来建立,格式符合字典的要求即可。
字典特点:
- 符号为大括号
- 数据为键值对形式出现
- 各个键值对之间用逗号隔开
# 有数据字典
dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
# 空字典
dict2 = {}
dict3 = dict()
dic=dict([("chinese",90),("math",95)])
dic=dict(chinese=90,math=95)
注意:一般称冒号前面的为键(key),简称k;冒号后面的为值(value),简称v。
访问字典里的值
由于字典没有索引,所以我们不能使用索引的方法来访问字典。要访问字典里的值,有两种常用方法。
第一种:使用字典名加键进行访问,这种方法有点像是把键当作字典的“索引”来访问,格式为“字典名[键名]”,如下例所示。
>>> d = {"西瓜":9.6,"桃子":2,"苹果":4,"樱桃":12}
>>> print(d["樱桃"])
12
>>> print(d["香蕉"])
KeyError: '香蕉'
注意:如果键不存在,则报KeyError错误
第二种:使用字典中的get()函数进行访问,格式为“字典名.get(键名)”, 如下例所示。
- 语法
字典序列.get(key, 默认值)
注意:如果当前查找的key不存在则返回第二个参数(默认值),如果省略第二个参数,则返回None。
- 快速体验
dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
print(dict1.get('name')) # Tom
print(dict1.get('id', 110)) # 110
print(dict1.get('id')) # None
修改和新增字典
修改已有的键的值
直接使用字典名加键的方式进行赋值即可,如下例所示。
>>> d = {"西瓜":9.6,"桃子":2,"苹果":4,"樱桃":12}
>>> d["樱桃"]=20
>>> print(d)
{'西瓜': 9.6, '桃子': 2, '苹果': 4, '樱桃': 20}
给字典增添新的键值对
同样也采用字典加键的方式直接赋值即可,也就是说:采用该方法赋值,如果字典中已有键,则将该键的值修改为最新的值;如果字典中没有该键,则新增该键值对到字典中,如下例所示。
>>> d = {"西瓜":9.6,"桃子":2,"苹果":4,"樱桃":12}
>>> d['梨']=8
>>> print(d)
{'西瓜': 9.6, '桃子': 2, '苹果': 4, '樱桃': 12, '梨': 8}
update()函数
写法:dict.update(dict2)
说明:把字典dict2的键/值对更新到dict里。
dict = {'Name': '张三', 'Age': 7}
dict2 = {'Sex': '男', 'Age': 79 }
dict.update(dict2)
print (dict) #输出{'Name': '张三', 'Age': 79, 'Sex': '男'}
注意:字典dict2中key如果在dict1中存在则修改dict1这个key对应的值 ,如果key不存在则dict1新增此键值对。
删除字典
del() / del
说明:删除字典或删除字典中指定键值对
删除指定键值对
第一种写法
dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'} del dict1['gender'] print(dict1) # 结果:{'name': 'Tom', 'age': 20}
第二种写法
dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'} del(dict1['gender']) print(dict1) # 结果:{'name': 'Tom', 'age': 20}
删除字典
>>> dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
>>> del dict1
>>> dict1
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
dict1
NameError: name 'dict1' is not defined
clear()
说明:用于删除字典内所有元素
dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
dict1.clear()
print(dict1) # {}
pop()
说明:删除字典给定键 key 及对应的值,返回值为被删除的值。key 值必须给出,如果key不存在,则返回 default 值。
写法:字典.pop(key[,default])
参数:
key: 要删除的键值
default: 如果没有 key,返回 default 值
>>> dict = {'Name': '张三', 'Age': 7}
>>> pop_obj=dict.pop('Name')
>>> print(pop_obj)
张三
>>> dict
{'Age': 7}
>>> dict.pop('aaa')
Traceback (most recent call last):
File "<pyshell#9>", line 1, in <module>
dict.pop('aaa')
KeyError: 'aaa'
>>> dict.pop('aaa','不存在')
'不存在'
popitem()
说明:返回并删除字典中的最后一对键和值。
写法:字典.popitem()
>>> dict = {'Name': '张三', 'Age': 12, 'Class': '4年级'}
>>> pop_obj=dict.popitem()
>>> print(pop_obj)
('Class', '4年级')
>>> print(dict )
{'Name': '张三', 'Age': 12}
注意:如果字典已经为空,却调用了此方法,就报出 KeyError 异常。
求字典的长度
求字典的长度和求字符串的长度一样,使用len()函数进行求值,返回值为字典里元素的数量。
但是在这里要注意:字典中的键值对是按照一个元素对待的, 如下例所示。
>>> dict = {'牛奶':'18元','鸡蛋':'30元','薯条':'23元'}
>>> print(len(dict))
3
检查键是否在字典中
使用in可以检测键是否在字典中,如果在则返回True,否则返回False;
但是这里要注意:in只检查键,并不检查值。如下例中的” Python”是值,并不是键,所以返回值依然是False。
>>> dict = {'name':'Python', 'age': '21', 'edi': 3.7}
>>> print('Python' in dict)
False
字典的遍历
遍历字典对象
遍历字典对象,则是遍历对应的key,例如:
dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
for key in dict1:
print(key)
输出:
name
age
gender
遍历字典的key
dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
for key in dict1.keys():
print(key)
输出:
name
age
gender
遍历字典的value
dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
for value in dict1.values():
print(value)
输出:
Tom
20
男
遍历字典的元素
dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
for item in dict1.items():
print(item)
输出:
('name', 'Tom')
('age', 20)
('gender', '男')
遍历字典的键值对
dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
for key, value in dict1.items():
print(key,'=',value)
输出:
name = Tom
age = 20
gender = 男
易错题
字典的键具有唯一性,如果创建时同一键被赋值两次,则后一个值会取代前一个值成为键的值,如下例所示。
>>> dict = {'牛奶':'18元','鸡蛋':'30元','牛奶':'23元'} >>> print("dict['牛奶']:",dict['牛奶']) dict['牛奶']: 23元
键必须不可变,所以可以用数字、字符串或元组充当,而用列表就不行,会报TypeError错误,如下例所示。
>>>dict = {['name']: 'Python', 'age': '18岁'} TypeError: unhashable type: 'list'
字典的值必须使用字典里已有的键来访问,如果用字典里没有的键访问,会报KeyError错误。
把键当作“索引”访问字典和使用get()函数访间字典的区别:最大的区别是get()函数可以自定义没有该键时的返回值,如果没有自定义,则返回 None;而把键当作“索引”来访问字典时,如果没有该键,则会报错。
模拟考题
考题1 单选题
下面的代码的输出结果是()。
a={'sx':90,'yuwen':93,'yingyu':88,'kexue':98}
print(a['sx'])
A. 93 B. 90 C. 88 D. 98
答案:B
解析:a['sx']表示求键为‘sx’的值,根据题意,该值为90,所以答案为B。
考题2 单选题
已知字典score={"语文":95,"数学":93,"英语":97),则执行 print(score["语文"]+score["数学"]//2),输出的结果为( )。
A. 141 B. 141.5 C. 94 D. 94.0
答案:A
解析:根据题意,可知score["语文"]=95,score["数学"]=93,那么 score["语文"]+score["数学"]//2可以改为95+93//2。根据Python的运算符规则,我们先计算93//2=46,那么95+46=141,所以正确答案为A。
考题3 单选题
以下程序的运行结果是()。
a={"name":"jt","age":29,"class":5}
a["age"]=15
a["school"]="电子城中学"
print("age:",a["age"])
print("school:",a["school"])
A. age: 29 school:电子城中学 B. age: 15
C. age: 15 school:电子城中学 D. school:电子城中学
答案:C
解析:根据第2行、第3行代码可知,更新了age对应的值为15,添加了 school键和对应的信息“电子城中学”,最后字典的值成T ("name""age" :15,"class":5,"school”:”电子城中学"},所以 a["age"]的值为 15,a["school"] 的值是”电子城中学",正确答案是C。
字典单元测试题
模拟考题
一、单选题(共25题,每题2分,共50分)
1、执行下列代码,输出的结果是?( )
dic = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
dic.pop('b')
del dic['d']
dic['d'] = 4
print(dic)
A. {'a': 1, 'b': 2, 'c': 3,'d':4}
B. {'a': 1, 'c': 3, 'd': 4}
C. {'a': 1, 'c': 3}
D. {'d': 4}
2、下列代码的运行结果是?( )
a={'xm':'zhangsan'}
b={'sg':175,'tz':'55kg'}
b.update(a)
len(b)
A. 2
B. 3
C. 4
D. 6
3、在某学校,张三、李四、王五三名同学对应的学号分别是100、101、102。
现将他们学号与姓名对应的关系存入字典id_name中,关于以下代码段的描述,错误的是?( )
id_name = {101: '张三', 102: '李四', 103: '王五'}
name_id = {}
name_id[id_name[101]] = 101
name_id[id_name[102]] = 102
name_id[id_name[103]] = 103
print(id_name == name_id)
A. 在字典id_name中,只能通过学号查找对应的姓名,不能通过姓名查找对应的学号。
B. 上述代码是将id_name中姓名作为键、学号作为值构建了一个新的字典name_id。
C. 上述代码执行后,字典name_id为:{'张三': 101, '李四': 102, '王五': 103}
D. 上述代码输出的结果为:True。
4、下面代码的输出结果是?( )
a={'sx':90,'yuwen':93,'yingyu':88,'kexue':98}
print(a['sx'])
A. 93
B. 90
C. 88
D. 98
5、以下程序的运行结果是?( )
a={"name":"jt","age":29,"class":5}
a["age"]=15
a["school"]="派森社"
print("age:",a["age"])
print("school:",a["school"])
A. age: 29 school: 派森社
B. age: 15
C. age: 15 school: 派森社
D. school: 派森社
6、下列不属于Python中处理字典的方法是?( )
A. pop()
B. replace()
C. get()
D. popitem()
7、d1 = {'a': 100, 'b': 200, 'c':300}。下面什么代码可以将d1改成{'a': 150, 'b': 200, 'c':300}
A. d1[0] = 150
B. d1[a] = 150
C. d1['a'] = 150
D. d1[100] = 150
8、words = {"Chinese":"中文", "English":"英语", "French":"法语", "Korean":"韩语"}
运行以下代码后输出的结果是?( )
del words["French"]
print(len(words))
A. 6
B. 3
C. 8
D. 4
9、关于字典的描述错误的是?( )
A. 字典的元素以键为索引进行访问
B. 字典的长度是可变的
C. 字典的一个键可以对应多个值
D. 字典是键值对的结合,键值对之间没有顺序
10、下列语句中,无法创建字典dic的是?( )
A. dic={"chinese":90,"math":95}
B. dic=dict([("chinese",90),("math",95)])
C. dic=dict(chinese=90,math=95)
D. dic={[("chinese",90),("math",95)]}
11、下列说法错误的是?( )
A. 字典是可变的无序集合
B. 列表、元组可以相互嵌套使用
C. 字典虽然不能利用下标访问元素,但可以排序
D. 字典属于一对一映射关系的数据类型
12、下列有关字典对象的说法,不正确的是?( )
A. 字典中的值可以是任意类型的数据
B. 字典中的每个元素包含键和值两部分
C. 在同一个字典中,键值必须互不相同
D. 可以通过字典的键找到对应的值,也可以通过值来找到对应的键
13、以下创建字典的方法,正确的是?( )
A. d={学号,001,姓名,张三,成绩,98}
B. d={'学号':'001','姓名':'张三','成绩':98}
C. d={'学号','001','姓名','张三','成绩',98}
D. d={'学号':'001';'姓名':'张三';'成绩':98}
14、对于字典dic={1:2,'3':'d','sex':1,4:{'No':1,'name':'Mike'}},len(dic)的值是?( )
A. 3
B. 4
C. 5
D. 6
15、以下语句不正确的是?( )
A. dict={1:'a'}
B. a={'name':'bob'}
C. e={[1]:'篮球'}
D. c={'school':'精英小学'}
16、运行下列程序,输出的结果是?( )
d={"王明":178,"张华":158,"于飞":189,"刘英":164}
d["张华"]=162
print(d)
A. {'王明': 178, '张华': 158, '于飞': 189, '刘英': 164}
B. {' '张华': 162}
C. {'王明': 178, '张华': 162, '于飞': 189, '刘英': 164}
D. {'王明': 178, '张华': 158, '于飞': 189, '刘英': 164, '张华': 162}
17、若dic_color={'red':'红色','green':'绿色','gold':'金色','brown':'棕色','purple':'紫色'},以下选项中能够输出'金色'的是?( )
A. print(dic_color['gold'])
B. print(dic_color['金色'])
C. print(dic_color[2])
D. print(dic_color.values[2])
18、执行以下程序
a={'gj':'china','nl':12,'xb':'女'}
a['nl']=11
del a['gj']
a['xm']='xxs'
print(a)
运行结果是?( )
A. {'gj':'china','nl':11,'xb':'女'}
B. {'nl':11,'xb':'女'}
C. {'nl': 11, 'xb': '女', 'xm': 'xxs'}
D. {'nl': 12, 'xm': 'xxs', 'xb': '女'}
19、以下语句不能创建字典的是?
A. dic={}
B. dic={12:34}
C. dic={[12]:[34]}
D. dic={(12):(34)}
20、执行下列程序的结果为?( )
message1={'name':'Tom','age':14,'city':'London'}
for v in message1.values():
print(v,end='')
A. Tom14London
B. nameageLondon
C. name:Tom
D. Tom
21、今天编程课的主要内容是字典的遍历。
已知字典dt={'a':[1,3,5],'b':[3,4,7],'c':[2,5,9]},老师要求用四种不同的方法遍历字典,都要获得如下结果
[1, 3, 5]
[3, 4, 7]
[2, 5, 9]
小程同学尝试写了四段程序,请你帮他检查一下哪个程序的打印结果不符合要求?
A.
dt={'a':[1,3,5],'b':[3,4,7],'c':[2,5,9]}
ls=[]
for i in dt.values():
ls.append(i)
print(i)
B.
dt={'a':[1,3,5],'b':[3,4,7],'c':[2,5,9]}
ls=[]
for i in dt:
ls.append(dt[i])
for j in ls:
print(j)
C.
dt={'a':[1,3,5],'b':[3,4,7],'c':[2,5,9]}
ls=[]
for k in dt.keys():
ls.append(dt[k])
for j in ls:
print(j)
D.
dt={'a':[1,3,5],'b':[3,4,7],'c':[2,5,9]}
ls=[]
for k in dt.items():
print(k)
22、给定字典d,哪个选项对x in d的描述是正确的?
A. 判断x是否是字典d中的键
B. x是一个二元元组,判断x是否是字典d中的键值对
C. 判断x是否是字典d中的值
D. 判断x是否是在字典d中以键或值方式存在
23、score={'跳绳':85,'跳远':99,'跑步':92} 。下列哪个代码可以将跳绳的85修改成95?( )
A. score[跳绳]=95
B. score['跳绳']=95
C. score[0]=95
D. score['0']=95
24、想要删除gift字典中的键值对 '糖果' : 10, 可以使用的代码是?( )
A. gift.pop('糖果':10)
B. gift.pop('糖果')
C. gift.remove('糖果':10)
D. gift.remove('糖果')
25、下面的d是一个字典变量,能够输出数字9的语句是?( )
d = {'奥运奖牌':{'金牌':5,'银牌':4},'金牌':9,'银牌':4}
A. print(d['奥运奖牌']['金牌'])
B. print(d['金牌'])
C. print(d['奥运奖牌'][-1])
D. print(d['金牌'][1])
二、判断题(共10题,每题2分,共20分)
26、在使用del语句删除字典中不需要的元素时,必须指定字典名和要删除的键。
正确 错误
27、字典中的元素称为键值对,包括一个键和一个值,键和值中间用逗号隔开。
正确 错误
28、在使用get()语句返回字典中指定键的值的时候,如果该键的值在字典中不存在,则返回系统默认值“unKnown”。
正确 错误
29、字典是可变对象,字典有键(key)和值(value),其中键(key)和值(value)都是不可以重复的。
正确 错误
30、字典中的键必须是唯一的,必须是不可变数据类型,如字符串、数字或列表。
正确 错误
31、Python列表、元组、字典都属于有序序列,都可以用索引进行访问。
正确 错误
32、{'b':[4.9,2.1],(0,136,97):(1.36,11,8),321:{'a':91,55:0}}是一个合法的字典。
正确 错误
33、字典中的键和值必须用冒号隔开,同一个字典中的所有键都必须是唯一的.( )
正确 错误
34、字典中的键是唯一的,不能重复。而值对应于键,值是可以重复的
正确 错误
35、列表和元组都可以作为字典的键
正确 错误
三、编程题(共2题,共30分)
36、编写一段程序程序,实现输入的数字自动改为对应的星期几,如下图所示,
当输入1时,输出:1 —— 星期一;
当输入2时,输出:2 —— 星期二
……以此类推,
当输入7时,输出:7 —— 星期日。
注意,程序运行后,用户是随机输入数字1-7。
37、实现统计字符串中的单词和单词出现的次数:
要求如下:
(1)统计的语句为:to be or not to be that is a question
(2)要求统计该句中出现的所有单词和其出现次数。
(3)使用字典进行输出,格式如下(注意:排列顺序可以不一致,但是统计的次数要正确):
{'to': 2, 'be': 2, 'or': 1, 'not': 1, 'is': 1, 'a': 1, 'question': 1, 'that': 1}
答案
一、单选题
1、B 2、B 3、D
4、B
试题解析:字典是通过键来访问数据的,‘sx’对应的数据为90,所以选择B
5、C 6、B 7、C 8、B 9、C 10、D 11、C
12、D
试题解析:在字典中,可以通过字典的键找到对应的值,但不能通过值来找到对应的键。
13、B 14、B
15、C
试题解析:定义字典时,键和值是文本时,需要使用引号。字典键不可以使用列表
16、C 17、A 18、C 19、C 20、A
21、D 22、A 23、B
24、B
试题解析:字典中,使用pop删除字典的键值对,参数是键。
25、B
试题解析:本题考查访问字典里的值,同时考查易错点字典的值如果创建同一键被赋值两次,则后一个值会取代前一个值成为键的值。故选择B。
二、判断题
26、正确
27、错误
试题解析:字典中的元素称为键值对,包括一个键和一个值,键和值中间用冒号隔开。
28、错误
试题解析:在使用get()语句返回字典中指定键的值的时候,如果该键的值在字典中不存在,则返回系统默认值“None”
29、错误
30、错误
试题解析:字典中的键必须是唯一的,必须是不可变数据类型,如字符串、数字或元组。列表是可变对象,因此错误。
31、错误
试题解析:字典是映射,不是序列
32、正确 33、正确 34、正确 35、错误
三、编程题
36、参考程序:
d={1:'星期一',2:'星期二',3:'星期三',4:'星期四',5:'星期五',6:'星期六',7:'星期日'}
while True:
t=input('输入数字:')
print(t,'——',d.get(int(t)))
评分细则: 1)有列表、元组、或者字典任意一种数据类型;(2分) 2)有输入语句;(2分) 3)有数据类型转换;(2分) 4)有循环语句;(2分) 5)运行正确。(2分)
37、 参考程序:
string = "to be or not to be that is a question"#定义变量存储字符串
lis=string.split(" ")#使用分割函数将字符串转为列表
count={}#定义一个空字典
for x in lis:#遍历列表
if x not in count:#判断列表元素是否在字典中
count[x]=1
else:
count[x]+=1
print(count)#打印字典