第九章 字典

学习要点

学习字典的基本概念和操作。

对标内容

创建字典、访问字典里的值、删除字典里的元素、修改字典。

情景导入

可以通过音序查字法查找到相应的字;如果我们只知道字的写法,但是不知道读音,可以通过部首查字法查找到相应的读音。大家有没有发现, 不管使用哪种查字法,都必须要有一个已知关键信息,通过这个关键信息可以找到对应的其他信息。这其实也是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

说明:删除字典或删除字典中指定键值对

  • 删除指定键值对

    1. 第一种写法

      dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
      del dict1['gender']
      print(dict1)    # 结果:{'name': 'Tom', 'age': 20}
      
    2. 第二种写法

      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 =

易错题

  1. 字典的键具有唯一性,如果创建时同一键被赋值两次,则后一个值会取代前一个值成为键的值,如下例所示。

    >>> dict = {'牛奶':'18元','鸡蛋':'30元','牛奶':'23元'}
    >>> print("dict['牛奶']:",dict['牛奶'])
    dict['牛奶']: 23

    键必须不可变,所以可以用数字、字符串或元组充当,而用列表就不行,会报TypeError错误,如下例所示。

    >>>dict = {['name']: 'Python', 'age': '18岁'}
    TypeError: unhashable type: 'list'
    
  2. 字典的值必须使用字典里已有的键来访问,如果用字典里没有的键访问,会报KeyError错误。

  3. 把键当作“索引”访问字典和使用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。

image.png

  

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)#打印字典
Copyright © all right reserved,powered by Gitbook该文件修订时间: 2023-07-23 16:09:29