第1关:创建大学英语四级单词字典
任务描述
本关任务:编写一个能创建大学英语四级单词字典的小程序。
相关知识
为了完成本关任务,你需要掌握:
1.创建空字典
2.字典中增加元素
3.字典视图
4.字典排序
创建空字典
空的大括号{}和无参数的dict()函数都可以用于创建空字典。
cet_dic = {} # 创建空字典
cet_dic = dict() # 创建空字典
字典中增加元素
1.dict[key] = value方法
示例如下:
# 1. 将变量word为键,变量trans为值的元素加入到字典中
cet_dic = {} # 创建空字典
word, trans = ['workshop', 'n.专题讨论会']
cet_dic[word] = trans
print(cet_dic) # {'workshop': 'n.专题讨论会'}
2.dict.update(k1=v1,)
# 2. 将参数中的键值对转为字典元素加入字典中
cet_dic = {} # 创建空字典
cet_dic.update(bug='n.虫子;臭虫') # 更新列表,将参数中的字典元素加入到字典cet_dic中
print(cet_dic) # {'bug': 'n.虫子;臭虫'}
3.dict.update({k1:v1})
# 3. 更新列表,将参数中的字典元素加入到字典cet_dic中
cet_dic = {} # 创建空字典
word, trans = ('absent', 'a.不在意的')
cet_dic.update({word: trans})
print(cet_dic) # {'absent': 'a.不在意的'}
4.字典合并运算"|"和字典更新运算"|="
# 4. 字典合并运算"|"和字典更新运算"|="
cet_dic = {} # 创建空字典
word, trans = ('bronze', 'n.青铜色')
cet_dic |= {word: trans}
print(cet_dic) # {'bronze': 'n.青铜色'}
字典视图
dic.keys() 可获得字典键的视图
dic.values()可获得字典值的视图
dic.items() 可获得字典键值对的视图
cet_dic = {'bug': 'n.虫子;臭虫', 'absent': 'a.不在意的', 'bronze': 'n.青铜色'}
print(cet_dic.keys()) # dict_keys(['bug', 'absent', 'bronze'])
print(cet_dic.values()) # dict_values(['n.虫子;臭虫', 'a.不在意的', 'n.青铜色'])
print(cet_dic.items())
# dict_items([('bug', 'n.虫子;臭虫'), ('absent', 'a.不在意的'), ('bronze', 'n.青铜色')])
字典排序
字典无序,也没有排序方法!!!
可以用sorted(dic)函数对字典键、值或键值对进行排序
cet_dic = {'bug': 'n.虫子;臭虫', 'absent': 'a.不在意的', 'bronze': 'n.青铜色'}
print(sorted(cet_dic.keys())) # ['absent', 'bronze', 'bug']
print(sorted(cet_dic.values())) # ['a.不在意的', 'n.虫子;臭虫', 'n.青铜色']
print(sorted(cet_dic.items())) # 用键做排序依据,对键值对进行排序,字典元素转元组类型,返回列表
# [('absent', 'a.不在意的'), ('bronze', 'n.青铜色'), ('bug', 'n.虫子;臭虫')]
print(sorted(cet_dic.items(), key=lambda x: x[1])) # 用值做排序依据
# [('absent', 'a.不在意的'), ('bug', 'n.虫子;臭虫'), ('bronze', 'n.青铜色')]
小明同学在准备参加大学英语四六级考试,为了督促自己背单词,他决定自己写一个背单词的程序。
编程要求
根据提示,在右侧编辑器补充代码,读取数据集中的四级单词文件,以单词为键,以中文解释为值创建字典。输入一个正整数n,输出所创建字典排序后的前n项。
测试说明
平台会对你编写的代码进行测试:
测试输入:
10
预期输出:
[('African', 'a.非洲的 n.非洲人'), ('Arabian', 'a.阿拉伯的'), ('Atlantic', 'a.大西洋的 n.大西洋'), ('August', 'n.八月'), ('Australia', 'n.澳大利亚'), ('Australian', 'a.澳大利亚的'), ('B.C.', '(缩)公元前'), ('Bible', 'n.基督教《圣经》'), ('Britain', 'n.不列颠,英国'), ('British', 'a.不列颠的,英联邦的')]
def create_dict(file):"""接收表示文件名的字符串参数,读文件中的单词及释义,以单词为键,其他部分为值创建字典。多个释义间可能是逗号或空格分隔,但单词与第一个释义间至少有一个空格,将文件每一行根据空格切分一次,切分结果分别作为键和值创新字典。返回字典。"""# 在下面一行补充代码,创建一个空字典cet_dic = {} # 创建空字典with open(file, 'r', encoding='utf-8') as data: # 打开文件,以读模式创建文件对象for x in data: # 遍历文件对象word, trans = x.strip().split(maxsplit=1) # 每行根据空格切分为列表,只切分一次,将单词与释义分开# 补充程序,列表的首个元素作为字典的键,第二个元素做字典的值,加入字典中,返回这个字典cet_dic.update({word:trans}) return cet_dicif __name__ == '__main__':filename = '/data/bigfiles/cet4.txt'n = int(input()) # 输入一个正整数cet_dict = create_dict(filename) # 调用函数,返回字典类型数据# 在下面补充语句,根据字典的键对字典进行排序,得到排序的列表,输出列表前n项print([x for x in sorted(cet_dict.items())][:n])
第2关:合并大学英语四六级词汇字典
本关任务:编写一个能将大学英语四级、六级词汇合并为一个字典的小程序。
相关知识
为了完成本关任务,你需要掌握:
1.合并字典
合并字典
1.dic1.update(dic2):更新列表,将参数中的字典元素加入到字典cet_dic中
cet4_dic = {'bug': 'n.虫子;臭虫', 'absent': 'a.不在意的'}
cet6_dic = {'absent': 'a.不在意的', 'bronze': 'n.青铜色'}
cet4_dic.update(cet6_dic) # cet6_dic更新到cet4_dic中
print(cet4_dic) # {'bug': 'n.虫子;臭虫', 'absent': 'a.不在意的', 'bronze': 'n.青铜色'}
2.字典合并运算"|"和字典更新运算"|="
cet4_dic = {'bug': 'n.虫子;臭虫', 'absent': 'a.不在意的'}
cet6_dic = {'absent': 'a.不在意的', 'bronze': 'n.青铜色'}
cet_dic = cet4_dic | cet6_dic # 合并字典返回新对象
print(cet_dic) # {'bug': 'n.虫子;臭虫', 'absent': 'a.不在意的', 'bronze': 'n.青铜色'}
cet4_dic |= cet6_dic # cet6_dic合并到cet4_dic中
print(cet4_dic) # {'bug': 'n.虫子;臭虫', 'absent': 'a.不在意的', 'bronze': 'n.青铜色'}
小明同学在准备参加大学英语四六级考试,为了督促自己背单词,他决定自己写一个背单词的程序。
编程要求
根据提示,在右侧编辑器补充代码:
读取cet4.txt和cet6.txt,合并成一个字典(注:因测评需要,务必将cet6.txt中的单词合并到cet4.txt所在的字典中)。
输入一个正整数n,输出所创建字典排序后的前n项。
测试说明
平台会对你编写的代码进行测试:
测试输入:
20
预期输出:
[('African', 'a.非洲的 n.非洲人'), ('Arabian', 'a.阿拉伯的'), ('Atlantic', 'a.大西洋的 n.大西洋'), ('August', 'n.八月'), ('Australia', 'n.澳大利亚'), ('Australian', 'a.澳大利亚的'), ('B.C.', '(缩)公元前'), ('Bible', 'n.基督教《圣经》'), ('Britain', 'n.不列颠,英国'), ('British', 'a.不列颠的,英联邦的'), ('Buddhism', 'n.佛教,释教'), ('Canada', 'n.加拿大'), ('Canadian', 'a.加拿大的'), ('Catholic', 'a.天主教的n.天主教徒'), ('Christ', 'n.救世主(耶稣基督)'), ('Christian', 'a.基督教的'), ('Christmas', 'n.圣诞节'), ('December', 'n.十二月'), ('Egyptian', 'a.埃及的 n.埃及人'), ('European', 'a.欧洲的 n.欧洲人')]
def create_dict(file):"""接收表示文件名的字符串参数,读文件中的单词及释义,以单词为键,其他部分为值创建字典。多个释义间可能是逗号或空格分隔,但单词与第一个释义间至少有一个空格,将文件每一行根据空格切分一次,切分结果分别作为键和值创新字典。返回字典。"""# 补充你的代码cet_dic = {}with open(file, 'r' ,encoding = 'utf-8')as data:for x in data:word,trans = x.strip().split(maxsplit = 1)cet_dic.update({word:trans})return cet_dicdef merge_dic(file1, file2):"""将读取两个文件中获得的字典合并为一个,返回合并后的字典"""# 补充你的代码dict1 = create_dict(file1)dict2 = create_dict(file2)dict3 = dict1 | dict2return dict3def sort_dic(cet_dic, n):"""根据字典的键对字典进行排序,得到排序的列表,返回列表前n项"""# 补充你的代码return ([x for x in sorted(cet_dict.items())][:n])if __name__ == '__main__':filename1 = '/data/bigfiles/cet4.txt' # 数据文件名filename2 = '/data/bigfiles/cet6.txt' # 数据文件名num = int(input()) # 输入一个正整数cet_dict = merge_dic(filename1, filename2) # 调用函数,返回字典类型数据print(sort_dic(cet_dict, num)) # 输出排序后列表前n项
第3关:查单词输出中文释义
任务描述
本关任务:编写一个能查询单词中文释义的小程序。
相关知识
为了完成本关任务,你需要掌握:
1.获取字典值
获取字典值
1.dic1[key]:在字典dic1中查询键为key的元素的值
cet_dic = {'bug': 'n.虫子;臭虫', 'absent': 'a.不在意的', 'bronze': 'n.青铜色'}
print(cet_dic['bug']) # n.虫子;臭虫
键不存在时触发异常
cet_dic = {'bug': 'n.虫子;臭虫', 'absent': 'a.不在意的', 'bronze': 'n.青铜色'}
print(cet_dic['bag']) # KeyError: 'bag'
2.dic1.get(k[,default]) 字典dic中存在键为k的元素时,返回其值,否则返回default参数设定值。
此方法无论键是否存在,都可以使用,且键不存在时可直接返回一个默认值,可简化程序,推荐使用。
cet_dic = {'bug': 'n.虫子;臭虫', 'absent': 'a.不在意的', 'bronze': 'n.青铜色'}
print(cet_dic.get('bug', '单词不存在')) # n.虫子;臭虫
print(cet_dic.get('bag', '单词不存在')) # 单词不存在
小明同学在准备参加大学英语四六级考试,为了督促自己背单词,他决定自己写一个背单词的程序。
编程要求
根据提示,在右侧编辑器补充代码,读取数据集中的四级单和六级词文件,以单词为键,以中文解释为值,将两个文件中的数据创建为一个字典。输入一个单词,查询并输出对应的释义,单词在字典中不存在时,输出'单词不存在'。
测试说明
平台会对你编写的代码进行测试:
测试输入:
merry
预期输出:
merry: a.欢乐的,愉快的
测试输入:
return
预期输出:
return: 单词不存在
def create_dict(file):"""接收表示文件名的字符串参数,读文件中的单词及释义,以单词为键,其他部分为值创建字典。多个释义间可能是逗号或空格分隔,但单词与第一个释义间至少有一个空格,将文件每一行根据空格切分一次,切分结果分别作为键和值创新字典。返回字典。"""# 补充你的代码cet_dic = {}with open(file, 'r', encoding = 'utf-8') as data:for x in data:word,trans = x.strip().split(maxsplit = 1)cet_dic.update({word:trans})return cet_dicdef merge_dic(file1, file2):"""将读取两个文件中获得的字典合并为一个,返回合并后的字典"""# 补充你的代码dict1 = create_dict(file1)dict2 = create_dict(file2)dict3 = dict1 | dict2return dict3def translate(cet_dic, word):"""接收两个参数,第一个是读文件创建的字典,第二个参数为要查询的单词,字符串根据文件创建的字典,从中查询单词word,如果查询单词存在,元组形式返回词与词的释义;如果查询不存在,返回'单词不存在'"""# 补充你的代码if word in cet_dic:return word,cet_dic[word]else:return word,"单词不存在"if __name__ == '__main__':filename1 = '/data/bigfiles/cet4.txt' # 数据文件名filename2 = '/data/bigfiles/cet6.txt' # 数据文件名word = input() # 输入一个单词cet_dict = merge_dic(filename1, filename2) # 调用函数,返回字典类型数据result = translate(cet_dict, word)print('{}: {}'.format(*result))
第4关:删除字典中特定字母开头的单词
任务描述
本关任务:编写一个能删除字典中特定字母开头的单词的小程序。
相关知识
为了完成本关任务,你需要掌握:
1.删除字典元素
删除字典元素
1.dic1.pop(key[,default]):删除字典dic1中键为key的元素
cet_dic = {'bug': 'n.虫子;臭虫', 'absent': 'a.不在意的', 'bronze': 'n.青铜色'}
cet_dic.pop('bug') # 删除键为'bug'的元素
print(cet_dic) # {'absent': 'a.不在意的', 'bronze': 'n.青铜色'}
key不存在时返回default:
cet_dic = {'bug': 'n.虫子;臭虫', 'absent': 'a.不在意的', 'bronze': 'n.青铜色'}
cet_dic.pop('bag', f'{"bag"}在字典中不存在') # 删除键为'bug'的元素
print(cet_dic) # {'bug': 'n.虫子;臭虫', 'absent': 'a.不在意的', 'bronze': 'n.青铜色'}
无default且键不存在时触发异常
cet_dic = {'bug': 'n.虫子;臭虫', 'absent': 'a.不在意的', 'bronze': 'n.青铜色'}
cet_dic.pop('bag') # 删除键为'bug'的元素
print(cet_dic) # KeyError: 'bag'
2.dic1.popitem():删除字典dic1末尾的一个元素
cet_dic = {'bug': 'n.虫子;臭虫', 'absent': 'a.不在意的', 'bronze': 'n.青铜色'}
cet_dic.popitem() # 删除字典末尾一个元素
print(cet_dic) # {'bug': 'n.虫子;臭虫', 'absent': 'a.不在意的'}
cet_dic.popitem() # 删除字典末尾一个元素
print(cet_dic) # {'bug': 'n.虫子;臭虫'}
小明同学在准备参加大学英语四六级考试,为了督促自己背单词,他决定自己写一个背单词的程序。
编程要求
根据提示,在右侧编辑器补充代码,读取数据集中的四级单和六级词文件,以单词为键,以中文解释为值,将两个文件中的数据创建为一个字典。删除字典中特定字母开头的单词(首字母不区分大小写),输出删除后字典长度。
测试说明
平台会对你编写的代码进行测试:
测试输入:
a
预期输出:
4918
def create_dict(file):"""接收表示文件名的字符串参数,读文件中的单词及释义,以单词为键,其他部分为值创建字典。多个释义间可能是逗号或空格分隔,但单词与第一个释义间至少有一个空格,将文件每一行根据空格切分一次,切分结果分别作为键和值创新字典。返回字典。"""# 补充你的代码cet_dic = {}with open(file, 'r',encoding = 'utf-8') as data:for x in data:word ,trans = x.strip().split(maxsplit = 1)cet_dic.update({word:trans})return cet_dicdef merge_dic(file1, file2):"""将读取两个文件中获得的字典合并为一个,返回合并后的字典"""# 补充你的代码dict1 = create_dict(file1)dict2 = create_dict(file2)dict3 = dict1 | dict2return dict3def del_words(cet_dic, letter):"""删除字典中首字母与参数letter相同的单词,返回删除后的字典"""# 补充你的代码list1 = [x for x in cet_dic]for i in range(len(list1)):if list1[i][0].lower() == letter:cet_dic.pop(list1[i])return cet_dicif __name__ == '__main__':filename1 = '/data/bigfiles/cet4.txt' # 数据文件名filename2 = '/data/bigfiles/cet6.txt' # 数据文件名alphabet = input().lower() # 输入一个字母cet_dict = merge_dic(filename1, filename2) # 调用函数,返回字典类型数据result = del_words(cet_dict, alphabet) # 删除特定单词后的字典print(len(result)) # 输出字典长度
第5关:单词英汉记忆训练
任务描述
本关任务:编写一个能提供基本的背单词功能的小程序。
相关知识
为了完成本关任务,你需要掌握:
1.字典元素筛选
2.字典增加元素
3.字典遍历
4.字典查询
小明同学在准备参加大学英语四六级考试,为了督促自己背单词,他决定自己写一个背单词的程序。
编程要求
根据提示,在右侧编辑器补充代码,读取数据集中的四级单和六级词文件,以单词为键,以中文解释为值,将两个文件中的数据创建为一个字典。
用户根据提示文字信息输入一个字母,用这个字母的ASCII值为随机数种子,随机抽取这个字母开头的单词(首字母不区分大小写)进行记忆训练。
用户填写词义,用户输入的词义在释义中存在时认为回答正确,此时输出当前词全部释义;
输入错误时,记录该单词信息到错词字典;
用户直接输入回车时结束训练,并输出正确率并输出全部出错单词的信息。
测试说明
平台会对你编写的代码进行测试:
测试输入:
z
区域
热情
地区
斑马
热情
锌
班马
``
预期输出:(无阴影的部分是用户输入的字符,注意“输入今天训练单词首字母:”后面有一个换行)
输入今天训练单词首字母:z
请输入单词zone的中文翻译:区域
zone的释义为:n.地区,区域,范围
请输入单词zealous的中文翻译:热情
zealous的释义为:a.热心的,热情的
请输入单词zone的中文翻译:地区
zone的释义为:n.地区,区域,范围
请输入单词zebra的中文翻译:斑马
zebra的释义为:n.斑马
请输入单词zeal的中文翻译:热情
zeal的释义为:n.热心,热情,热忱
请输入单词zinc的中文翻译:锌
zinc的释义为:n.锌 vt.在…上镀锌
请输入单词zebra的中文翻译:班马
答案错误
请输入单词zealous的中文翻译:
训练结束!
需要加强记忆的单词:
zebra:n.斑马
import random
def create_dict(file):"""接收表示文件名的字符串参数,读文件中的单词及释义,以单词为键,其他部分为值创建字典。多个释义间可能是逗号或空格分隔,但单词与第一个释义间至少有一个空格,将文件每一行根据空格切分一次,切分结果分别作为键和值创新字典。返回字典。"""# 补充你的代码cet_dic = {}with open(file, 'r',encoding = 'utf-8') as data:for x in data:word ,trans = x.strip().split(maxsplit = 1)cet_dic.update({word:trans})return cet_dicdef merge_dic(file1, file2):"""将读取两个文件中获得的字典合并为一个,返回合并后的字典"""# 补充你的代码dict1 = create_dict(file1)dict2 = create_dict(file2)dict3 = dict1 | dict2return dict3def training(cet_dic, letter):"""输入一个字母,返回以这个字母开头的词汇的字典(不区分大小写),用于单词记忆训练"""# 补充你的代码list1 = [x for x in cet_dic]for i in range(len(list1)):if list1[i][0].lower() != letter:cet_dic.pop(list1[i])return cet_dicdef en_to_ch(train_dic):"""从训练字典中随机抽取以某个字母开头的单词,用户填写词义回答正确时,输出当前词全部释义,输入错误时,记录该单词信息,直接输入回车时结束输入,训练结束后输出全部出错单词的信息"""# 创建空字典,用于容纳答错单词dic1 = {}while True: # 无限循环用于一次训练记忆多个单词word = random.choice(list(train_dic.keys())) # 从字典的键中随机抽取一个单词print(f'请输入单词{word}的中文翻译:') # 输出提示语句answer = input() # 输入当前单词的语义if not answer: # 直接回车时输入为空,结束循环print('训练结束!')break# 补充你的程序,如果输入在释义中存在,输出完整释义,否则输出'答案错误'并将当前单词加入答错单词字典elif answer in train_dic[word]:print(f'{word}的释义为:{train_dic[word]}')elif answer not in train_dic[word]:print('答案错误')dic1[word] = train_dic[word]print('需要加强记忆的单词:')# 补充代码,逐个输出答错字典中的单词和释义for i in dic1:print(f'{i}:{dic1[i]}')if __name__ == '__main__':filename1 = '/data/bigfiles/cet4.txt' # 数据文件名filename2 = '/data/bigfiles/cet6.txt' # 数据文件名alphabet = input('输入今天训练单词首字母:\n').lower()random.seed(ord(alphabet)) # 用当前字典的ASCII值做随机数种子,方便评测cet_dict = merge_dic(filename1, filename2) # 调用函数,返回字典类型数据train_dict = training(cet_dict, alphabet) # 本次训练单词的字典en_to_ch(train_dict) # 调用函数进行训练