本章我们来讲解字典和集合。

下面来看例题:

第1关:字典的创建与访问

任务描述

本关任务:

(1)按格式要求分二次输入字典的所有键和对应值,将它们创建成一个学生成绩字典,输出字典

(2)查询并输出学生的姓名

(3)查询并输出学生的语文、英语成绩,如果不存在,返回”不存在”

(4)查询并输出字典中所有的值

(5)遍历字典中的元素,按格式分行输出字典元素

测试说明

平台会对你编写的代码进行测试:

测试输入:

请输入字典的键,以空格间隔:姓名 语文 数学

请输入字典对应的值,以空格间隔:张三 90 98

预期输出:

{'姓名': '张三', '语文': '90', '数学': '98'}

张三

90 不存在

dict_values(['张三', '90', '98'])

姓名 张三

语文 90

数学 98

代码解析

提示:利用zip函数创建字典

输入:d=dict(zip(['one','two','three'],[1,2,3]))

print(d)

输出: {'one': 1, 'two': 2, 'three': 3}

keys = input("请输入字典的键,以空格间隔:")items = input("请输入字典对应的值,以空格间隔:")keys = keys.split()items = items.split()dic = dict(zip(keys,items))print(dic)print(dic['姓名'])print(dic.get('语文','不存在'),dic.get('英语','不存在'))print(dic.values())for key,value in dic.items():print(f"{key} {value}")

第2关:字典元素的增加与修改

任务描述

本关任务:

(1)创建字典:已知字典的键分别为’a’、’b’、’c’,对应的值从键盘输入,请利用setdefault()方法为字典增加元素。

(2)请用update()方法增加字典元素,该元素的键为’d’,值为4

(3)遍历字典中的元素,按格式输出

测试说明

平台会对你编写的代码进行测试:

测试输入: 请输入三个数字,以英文逗号间隔:1,2,3

预期输出: a:1 b:2 c:3 d:4

代码解析

下面先来介绍Python字典的内置方法update()、get()和setdefault():

update()使用方法:

dict.update(dict2)

其中

  • dict2 — 添加到指定字典dict里的字典。

该方法把字典参数 dict2 的key/value(键/值)对更新到字典 dict 里。

get()使用方法:

dict.get(key,value)

其中

  • key — 字典中要查找的键。
  • value — (可不填)如果指定键的值不存在时,返回该默认值

使用该方法时,将返回指定键的值,如果键不在字典中返回默认值,如果不指定默认值,则返回None。

例如在刚才的第一关中:

dic = {'姓名': '张三', '语文': '90', '数学': '98'}dic.get('语文','不存在')dic.get('英语','不存在')

第二行将返回90,因为字典dic里面有“语文”这个键。而第三行将返回”不存在”,因为字典dic里面没有“英语”这个键,但是我们在后面输入了参数为字符串”不存在”,则将返回该字符串

setdefault()使用方法:

dict.setdefault(key, default=None)

其中

  • key — 查找的键值。
  • default — 键不存在时,设置的默认键值。

该方法和get()类似, 如果键不存在于字典中,将会添加键并将值设为默认值。使用该方法时,如果 key 在 字典中,返回对应的值。如果不在字典中,则插入 key 及设置的默认值 default,并返回 default ,其中default 默认值为 None。

关于字典中 get() 和 setdefault() 的区别:

主要在于当查找的键值 key 不存在的时候,setdefault()函数会返回默认值并更新字典,添加键值;而 get() 函数只返回默认值,并不改变原字典。

让我们回到题目:

dic1 = {}dic2 = {'d':4}items = input("请输入三个数字,以英文逗号间隔:")items = items.split(",")dic1.update(dic2)print("a:{}".format(dic1.setdefault('a',items[0])))print("b:{}".format(dic1.setdefault('b',items[1])))print("c:{}".format(dic1.setdefault('c',items[2])))print("d:{}".format(dic1['d']))

第3关:字符分类统计

任务描述

本关任务: 从键盘输入字母、数字或其它,分别统计每个字符出现的字数,并按出现的次数从大到小排序。

测试说明

平台会对你编写的代码进行测试:

测试输入:

请输入字符,字符之间以空格间隔:b b 1 1 1 2

预期输出:

1:3

b:2

2:1

代码解析

下面先介绍Python内置函数sorted()的用法:

sorted()使用方法:

sorted(iterable, key=None, reverse=False)

其中

  • iterable — 可迭代对象。
  • key — (可不填)主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
  • reverse — (可不填)排序规则,reverse = True 降序 , reverse = False 升序(默认)。

sort 与 sorted 区别:

sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。

list 的 sort 方法返回的是对已经存在的列表进行操作,而内建函数 sorted 方法返回的是一个新的 列表,而不是在原来的基础上进行的操作。

让我们回到题目:

chars = input("请输入字符,字符之间以空格间隔:").split()d = {}for c in chars:d[c] = d.get(c,0)+1ls = sorted(d.items(),key=lambda x:x[1],reverse=True)for item in ls:print("{}:{}".format(item[0],item[1]))

上面的第3至4行如果不好理解,也可以这样写:

for c in chars:if c in d:d[c] += 1else:d[c] = 1

上面的第6至7行有点不好理解,我们可以先来看看Python字典中的items()方法:

Python 字典 items() 方法以列表返回视图对象,是一个可遍历的key/value 对。dict.items()返回的是一个视图对象,提供了字典实体的动态视图,这就意味着字典改变,视图也会跟着变化。视图对象不是列表,不支持索引,但可以使用 list() 来转换为列表。我们不能对视图对象进行任何的修改,因为字典的视图对象都是只读的。

继续以第一关为例来看看items()方法的使用:

dic = {'姓名': '张三', '语文': '90', '数学': '98'}print(dic.items())print(list(dic.items()))

得到的结果将会是

dict_items([('姓名', '张三'), ('语文', '90'),('数学','98')])[('姓名', '张三'), ('语文', '90'),('数学','98')]

强制转化成列表后,列表元素都将会是元组。我们就可以通过循环来遍历每一个元组,再通过每个元组相应的索引值就可以访问每个元组当中的元素了。

这也正是第6至7行在做的事。

第4关:去重及排序

任务描述

本关任务:

输入一个数字列表,去掉列表中重复的数字,并降序输出。

测试说明

平台会对你编写的代码进行测试:

测试输入: 输入一个数字列表:[1,2,3,1,1,2,5,6]

预期输出:

6

5

3

2

1

代码解析

这一题我们可以用内置函数set()来创建一个无序不重复元素集以删除重复数据

ls=eval(input("输入一个数字列表:"))nSet=set(ls)list1=sorted(nSet,reverse=True)for n in list1:print(n)

第5关:词频统计

任务描述

本关任务: 统计一篇英语短文中各单词出现的次数,将出现2次及以上的单词从高到低输出。 词频的输出格式为:life(2),表示单词life出现了2次。

测试说明

平台会对你编写的代码进行测试:

测试输入:

请输入英文文章:Life is too short to spend time with people who suck the happiness out of you. If someone wants you in their life, they’ll make room for you. You shouldn’t have to fight for a spot. Never, ever insist yourself to someone who continuously overlooks your worth.

预期输出:

you(4)

to(3)

life(2)

who(2)

someone(2)

for(2)

代码解析

这一题就是把前面的题所用到的一些方法的综合运用:

text = input("请输入英文文章:")text = text.lower()for x in ",.!?;:":text = text.replace(x,"")text = text.split()dic = {}for x in text:dic[x] = dic.get(x,0)+1items = sorted(dic.items(),key = lambda x:x[1],reverse = True)for x in items:if x[1] >= 2:print(("{}({})".format(x[0],x[1])))