有一个文件里有英语单词的中文释义,单词与释义间用空格分隔,多个释义之间用逗号分隔(注意:少数单词有多种词性,不同词性之间用空格分隔),格式如下:
above prep.在...之上,高于above-mentioned adj.上述的abreast adv.并肩,并列abridge v.省略,摘要abroad adv.国外,海外all adj.所有的 n.一切live v.居住,生存 adj.活的
编写一个程序,实现英汉字典的功能。
Python里映射类型字典的数据结构是键值对的形式,正好可以存储英汉字典中的单词和释义,而且字典的查询效率很高。
在切分的时候,因为字典文件中不同词义间可能是空格分隔,多次切分可能会导致多个意义分开,这里用split(maxsplit=1)限制只切分一次,只把单词与释义切分开,多个释义一起做为字典的值。
def createDic(filename): # 构建词典dic = {} # 创建空字典with open(filename,'r',encoding = 'utf-8') as data:for x in data: # 遍历文件对象x = x.strip().split(maxsplit=1) # 每行根据空格切分为列表,只切分一次dic.update({x[0]:x[1]}) # 列表的两个元素作为字典的键和值加入字典中return dicif __name__ == '__main__':filename = 'dict.txt' # 文件名print(createDic(filename))
{‘a’: ‘一个’, ‘abandon’: ‘v.抛弃,放弃’, ‘abandonment’: ‘n.放弃’, ‘abbreviation’: ‘n.缩写’, ‘abeyance’: ‘n.缓办,中止’, ‘abide’: ‘v.遵守’, ‘ability’: ‘n.能力’, …}
在字典中查询单词释义
def translate(dic, word): # 元组形式返回词与词的释义word = word.lower() # 单词转小写return word,dic.get(word,'这个词我不明白') # 查询字典,返回单词的意义,单词不存在时,返回'这个词我不明白'if __name__ == '__main__':filename = 'dict.txt' # 文件名word = input() # 输入查询的单词dic = createDic(filename) # 调用函数返回字典类型的数据print(*translate(dic, word)) # 调用函数翻译并输出释义
输入:
abandon
输出:
abandon v.抛弃,放弃
输入一个英文句子,输出英文句子中每个单词的中文意思,每行一个单词,单词字母转小写,’s 用 is 替换,n’t 用 not 替换,单词与意义间用空格分隔,当查询的词在文件中不存在时,若末尾字母是 s,尝试去掉末尾的 s 查询;若末尾字母是 ed, 尝试去掉 d 或 ed 查询。 当单词在词典中不存在时,输出’这个词我不明白’
这里要注意的是要先完成”n’t”替换为 ‘ not’、”‘s”替换为 ‘ is’,再进行标点符号的替换,否则”‘“ 会被替换为空格,然后被切分开,导致输出错误。
def wordList(sentence): # 句子切分为单词的列表sentence = sentence.replace("n't", ' not') # "n't"替换为 ' not'sentence = sentence.replace("'s", ' is') # "'s"替换为 ' is'for x in string.punctuation: # 其他标点符号替换为空格sentence = sentence.replace(x, ' ')return sentence.split() # 根据空格切分句子为单词的列表
完整参考代码为:
import stringdef createDic(filename): # 构建词典dic = {} # 创建空字典with open(filename,'r',encoding = 'utf-8') as data:for x in data: # 遍历文件对象x = x.strip().split(maxsplit=1) # 每行根据空格切分为列表,只切分一次dic.update({x[0]:x[1]}) # 列表的两个元素作为字典的键和值加入字典中return dicdef translate(dic, word): # 元组形式返回词与词的释义word = word.lower() # 单词转小写return word,dic.get(word,'这个词我不明白') # 查询字典,返回单词的意义,单词不存在时,返回'这个词我不明白'def wordList(sentence): # 句子切分为单词的列表sentence = sentence.replace("n't", ' not') # "n't"替换为 ' not'sentence = sentence.replace("'s", ' is') # "'s"替换为 ' is'for x in string.punctuation: # 其他标点符号替换为空格sentence = sentence.replace(x, ' ')return sentence.split() # 根据空格切分句子为单词的列表if __name__ == '__main__':filename = 'dict.txt' # 文件名sentence = input() # 输入查询的单词dic = createDic(filename) # 调用函数返回字典类型的数据words = wordList(sentence)for word in words:print(*translate(dic, word)) # 调用函数翻译并输出释义
输入
For others, but to live for yourself.
输出
for prep.给,作…用的
others 这个词我不明白
but prep.但是,除了
to prep.向,到
live v.居住,生存 adj.活的
for prep.给,作…用的
yourself pron.你(们)自己
输入
Don’t you dare answer me back!
输出
do v.做,干,足够,制作
not adv.不
you pron.你,你们
dare v.敢,挑战,竟敢
answer n.答案 v.答复
me pron.我(宾格)
back n.背 adj.背后的
增加背单词功能
# -------- ------- --------# @File : 背单词.py# @Author : 赵广辉# @Contact: vasp@qq.com# @Company: 武汉理工大学# @Version: 1.0# @Modify : 2022/5/06 23:39# Python程序设计基础,高等教育出版社# 代码量1.5-2小时# -------- ------- --------import randomimport stringdef read_to_dic(filename):"""读文件每行根据空格切分一次,作为字典的键和值添加到字典中,返回一个字典类型数据。"""word_dic = {}with open(filename, 'r', encoding='utf-8') as data:for x in data:k, v = x.strip().split(maxsplit=1)word_dic[k] = v.split(',')return word_dicdef translate_word():"""调用此函数时,先输出提示信息:'请输入查询的单词:'用户可循环输入欲翻译的单词,若直接输入回车时,输出'查询结束,正在退出...'。输入非空时输出翻译结果"""while True:word = input('请输入查询的单词:') # 输入查询的单词if word == '':print('查询结束,正在退出...')breakelse:print(*translate(word))def translate(word):"""接收两个参数,第一个是读文件创建的字典,第二个参数为要查询的单词,字符串根据文件创建的字典,从中查询单词word,如果查询单词存在,元组形式返回词与词的释义;如果查询不存在,返回'单词不存在'"""word = word.lower() # 单词转小写return word, words_dic.get(word, '单词不存在') # 查询字典,返回单词的意义,单词不存在时,返回'这个词我不明白'def sentence_to_words():"""调用此函数时,先输出提示信息'请输入查询的句子:'用户输入欲翻译的句子若输入非空时,先将"n't"替换为 ' not'、"'s"替换为 ' is',再将标点符号替换为空格。根据空格将句子切分为单词的列表,调用translate逐个单词进行翻译。用户可重复多次输入,每输入一名翻译一句,若直接输入回车时,输出'查询结束,正在退出...'。然后结束程序。"""while True:sentence = input('请输入查询的句子:') # 输入查询的句子if sentence == '':print('查询结束,正在退出...')breaksentence = sentence.replace("n't", ' not').replace("'s", ' is') # "n't"替换为 ' not',"'s"替换为 ' is'for x in string.punctuation: # 其他标点符号替换为空格sentence = sentence.replace(x, ' ')word_list = sentence.split() # 根据空格切分句子为单词的列表for word in word_list:print(*translate(word)) # 调用函数翻译并输出释义def training():"""输入一个字母,返回以这个字母开头的词汇的字典,用于单词记忆训练"""letter = input('输入今天训练单词首字母:').lower()train_dict = {k: v for k, v in words_dic.items() if k[0].lower() == letter}return train_dictdef en_to_ch(train_dict):"""从训练字典中随机抽取以某个字母开头的单词,用户填写词义回答正确时,输出当前词全部释义,输入错误时,记录该单词信息,直接输入回车时结束输入,并输出全部出错单词的信息"""wrong_answer = {}while True:word = random.choice(list(train_dict.keys()))print(f'请输入单词{word}的中文翻译:')answer = input() # 输入要查询的单词,输入非空时循环,直接回车结束循环if not answer:for k, v in wrong_answer.items():print(f'{k}的释义为:', *v)breakelif answer in train_dict[word]:print(f'{word}的释义为:', *train_dict[word])else:print('答案错误')wrong_answer[word] = train_dict[word]def ch_to_en(train_dict):"""从训练字典中随机抽取以某个字母开头的单词的释义,用户填写英文单词回答正确时,输出当前词全部释义,输入错误时,记录该单词信息,直接输入回车时结束输入,并输出全部出错单词的信息"""wrong_answer = {}while True:word, chinese = random.choice(list(train_dict.items()))print(f'请输入{chinese}对应的单词:')answer = input() # 输入单词if not answer: # 直接输入回车时结束训练print('今天答错的词汇如下:')for k, v in wrong_answer.items(): # 遍历错题本,输出错误单词信息print(f'{v}的释义为:', k)break # 结束循环elif answer == word: # 若输入单词与原单词相同print(f'{answer}的单词为:', *train_dict[answer])else:print('答案错误')wrong_answer[word] = train_dict[word]def judge(option):"""根据输入调用不同函数"""if option == '汉英训练':today_dict = training() # 构建训练字典ch_to_en(today_dict)elif option == '英汉训练':today_dict = training() # 构建训练字典en_to_ch(today_dict)elif option == '翻译单词':translate_word() # 翻译单词elif option == '翻译单词':sentence_to_words() # 翻译单词else:print('输入错误,请重新运行程序!')if __name__ == '__main__':file = '../data/txt/dicts.txt'words_dic = read_to_dic(file) # 读文件构建字典choice = input() # 输入操作选项judge(choice) # 根据输入调用功能函数
