有一个文件里有英语单词的中文释义,单词与释义间用空格分隔,多个释义之间用逗号分隔(注意:少数单词有多种词性,不同词性之间用空格分隔),格式如下:

  1. above prep.在...之上,高于
  2. above-mentioned adj.上述的
  3. abreast adv.并肩,并列
  4. abridge v.省略,摘要
  5. abroad adv.国外,海外
  6. all adj.所有的 n.一切
  7. live v.居住,生存 adj.活的

编写一个程序,实现英汉字典的功能。

Python里映射类型字典的数据结构是键值对的形式,正好可以存储英汉字典中的单词和释义,而且字典的查询效率很高。
在切分的时候,因为字典文件中不同词义间可能是空格分隔,多次切分可能会导致多个意义分开,这里用split(maxsplit=1)限制只切分一次,只把单词与释义切分开,多个释义一起做为字典的值。

  1. def createDic(filename): # 构建词典
  2. dic = {} # 创建空字典
  3. with open(filename,'r',encoding = 'utf-8') as data:
  4. for x in data: # 遍历文件对象
  5. x = x.strip().split(maxsplit=1) # 每行根据空格切分为列表,只切分一次
  6. dic.update({x[0]:x[1]}) # 列表的两个元素作为字典的键和值加入字典中
  7. return dic
  8. if __name__ == '__main__':
  9. filename = 'dict.txt' # 文件名
  10. print(createDic(filename))

{‘a’: ‘一个’, ‘abandon’: ‘v.抛弃,放弃’, ‘abandonment’: ‘n.放弃’, ‘abbreviation’: ‘n.缩写’, ‘abeyance’: ‘n.缓办,中止’, ‘abide’: ‘v.遵守’, ‘ability’: ‘n.能力’, …}
在字典中查询单词释义

  1. def translate(dic, word): # 元组形式返回词与词的释义
  2. word = word.lower() # 单词转小写
  3. return word,dic.get(word,'这个词我不明白') # 查询字典,返回单词的意义,单词不存在时,返回'这个词我不明白'
  4. if __name__ == '__main__':
  5. filename = 'dict.txt' # 文件名
  6. word = input() # 输入查询的单词
  7. dic = createDic(filename) # 调用函数返回字典类型的数据
  8. print(*translate(dic, word)) # 调用函数翻译并输出释义

输入:
abandon
输出:
abandon v.抛弃,放弃

输入一个英文句子,输出英文句子中每个单词的中文意思,每行一个单词,单词字母转小写,’s 用 is 替换,n’t 用 not 替换,单词与意义间用空格分隔,当查询的词在文件中不存在时,若末尾字母是 s,尝试去掉末尾的 s 查询;若末尾字母是 ed, 尝试去掉 d 或 ed 查询。 当单词在词典中不存在时,输出’这个词我不明白’

这里要注意的是要先完成”n’t”替换为 ‘ not’、”‘s”替换为 ‘ is’,再进行标点符号的替换,否则”‘“ 会被替换为空格,然后被切分开,导致输出错误。

  1. def wordList(sentence): # 句子切分为单词的列表
  2. sentence = sentence.replace("n't", ' not') # "n't"替换为 ' not'
  3. sentence = sentence.replace("'s", ' is') # "'s"替换为 ' is'
  4. for x in string.punctuation: # 其他标点符号替换为空格
  5. sentence = sentence.replace(x, ' ')
  6. return sentence.split() # 根据空格切分句子为单词的列表

完整参考代码为:

  1. import string
  2. def createDic(filename): # 构建词典
  3. dic = {} # 创建空字典
  4. with open(filename,'r',encoding = 'utf-8') as data:
  5. for x in data: # 遍历文件对象
  6. x = x.strip().split(maxsplit=1) # 每行根据空格切分为列表,只切分一次
  7. dic.update({x[0]:x[1]}) # 列表的两个元素作为字典的键和值加入字典中
  8. return dic
  9. def translate(dic, word): # 元组形式返回词与词的释义
  10. word = word.lower() # 单词转小写
  11. return word,dic.get(word,'这个词我不明白') # 查询字典,返回单词的意义,单词不存在时,返回'这个词我不明白'
  12. def wordList(sentence): # 句子切分为单词的列表
  13. sentence = sentence.replace("n't", ' not') # "n't"替换为 ' not'
  14. sentence = sentence.replace("'s", ' is') # "'s"替换为 ' is'
  15. for x in string.punctuation: # 其他标点符号替换为空格
  16. sentence = sentence.replace(x, ' ')
  17. return sentence.split() # 根据空格切分句子为单词的列表
  18. if __name__ == '__main__':
  19. filename = 'dict.txt' # 文件名
  20. sentence = input() # 输入查询的单词
  21. dic = createDic(filename) # 调用函数返回字典类型的数据
  22. words = wordList(sentence)
  23. for word in words:
  24. 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.背后的

增加背单词功能

  1. # -------- ------- --------
  2. # @File : 背单词.py
  3. # @Author : 赵广辉
  4. # @Contact: vasp@qq.com
  5. # @Company: 武汉理工大学
  6. # @Version: 1.0
  7. # @Modify : 2022/5/06 23:39
  8. # Python程序设计基础,高等教育出版社
  9. # 代码量1.5-2小时
  10. # -------- ------- --------
  11. import random
  12. import string
  13. def read_to_dic(filename):
  14. """读文件每行根据空格切分一次,作为字典的键和值添加到字典中,返回一个字典类型数据。"""
  15. word_dic = {}
  16. with open(filename, 'r', encoding='utf-8') as data:
  17. for x in data:
  18. k, v = x.strip().split(maxsplit=1)
  19. word_dic[k] = v.split(',')
  20. return word_dic
  21. def translate_word():
  22. """调用此函数时,先输出提示信息:'请输入查询的单词:'
  23. 用户可循环输入欲翻译的单词,若直接输入回车时,输出'查询结束,正在退出...'。
  24. 输入非空时输出翻译结果
  25. """
  26. while True:
  27. word = input('请输入查询的单词:') # 输入查询的单词
  28. if word == '':
  29. print('查询结束,正在退出...')
  30. break
  31. else:
  32. print(*translate(word))
  33. def translate(word):
  34. """接收两个参数,第一个是读文件创建的字典,第二个参数为要查询的单词,字符串
  35. 根据文件创建的字典,从中查询单词word,
  36. 如果查询单词存在,元组形式返回词与词的释义;
  37. 如果查询不存在,返回'单词不存在'
  38. """
  39. word = word.lower() # 单词转小写
  40. return word, words_dic.get(word, '单词不存在') # 查询字典,返回单词的意义,单词不存在时,返回'这个词我不明白'
  41. def sentence_to_words():
  42. """调用此函数时,先输出提示信息'请输入查询的句子:'
  43. 用户输入欲翻译的句子
  44. 若输入非空时,先将"n't"替换为 ' not'、"'s"替换为 ' is',再将标点符号替换为空格。
  45. 根据空格将句子切分为单词的列表,调用translate逐个单词进行翻译。
  46. 用户可重复多次输入,每输入一名翻译一句,
  47. 若直接输入回车时,输出'查询结束,正在退出...'。然后结束程序。
  48. """
  49. while True:
  50. sentence = input('请输入查询的句子:') # 输入查询的句子
  51. if sentence == '':
  52. print('查询结束,正在退出...')
  53. break
  54. sentence = sentence.replace("n't", ' not').replace("'s", ' is') # "n't"替换为 ' not',"'s"替换为 ' is'
  55. for x in string.punctuation: # 其他标点符号替换为空格
  56. sentence = sentence.replace(x, ' ')
  57. word_list = sentence.split() # 根据空格切分句子为单词的列表
  58. for word in word_list:
  59. print(*translate(word)) # 调用函数翻译并输出释义
  60. def training():
  61. """输入一个字母,返回以这个字母开头的词汇的字典,用于单词记忆训练"""
  62. letter = input('输入今天训练单词首字母:').lower()
  63. train_dict = {k: v for k, v in words_dic.items() if k[0].lower() == letter}
  64. return train_dict
  65. def en_to_ch(train_dict):
  66. """从训练字典中随机抽取以某个字母开头的单词,用户填写词义
  67. 回答正确时,输出当前词全部释义,输入错误时,记录该单词信息,
  68. 直接输入回车时结束输入,并输出全部出错单词的信息"""
  69. wrong_answer = {}
  70. while True:
  71. word = random.choice(list(train_dict.keys()))
  72. print(f'请输入单词{word}的中文翻译:')
  73. answer = input() # 输入要查询的单词,输入非空时循环,直接回车结束循环
  74. if not answer:
  75. for k, v in wrong_answer.items():
  76. print(f'{k}的释义为:', *v)
  77. break
  78. elif answer in train_dict[word]:
  79. print(f'{word}的释义为:', *train_dict[word])
  80. else:
  81. print('答案错误')
  82. wrong_answer[word] = train_dict[word]
  83. def ch_to_en(train_dict):
  84. """从训练字典中随机抽取以某个字母开头的单词的释义,用户填写英文单词
  85. 回答正确时,输出当前词全部释义,输入错误时,记录该单词信息,
  86. 直接输入回车时结束输入,并输出全部出错单词的信息"""
  87. wrong_answer = {}
  88. while True:
  89. word, chinese = random.choice(list(train_dict.items()))
  90. print(f'请输入{chinese}对应的单词:')
  91. answer = input() # 输入单词
  92. if not answer: # 直接输入回车时结束训练
  93. print('今天答错的词汇如下:')
  94. for k, v in wrong_answer.items(): # 遍历错题本,输出错误单词信息
  95. print(f'{v}的释义为:', k)
  96. break # 结束循环
  97. elif answer == word: # 若输入单词与原单词相同
  98. print(f'{answer}的单词为:', *train_dict[answer])
  99. else:
  100. print('答案错误')
  101. wrong_answer[word] = train_dict[word]
  102. def judge(option):
  103. """根据输入调用不同函数"""
  104. if option == '汉英训练':
  105. today_dict = training() # 构建训练字典
  106. ch_to_en(today_dict)
  107. elif option == '英汉训练':
  108. today_dict = training() # 构建训练字典
  109. en_to_ch(today_dict)
  110. elif option == '翻译单词':
  111. translate_word() # 翻译单词
  112. elif option == '翻译单词':
  113. sentence_to_words() # 翻译单词
  114. else:
  115. print('输入错误,请重新运行程序!')
  116. if __name__ == '__main__':
  117. file = '../data/txt/dicts.txt'
  118. words_dic = read_to_dic(file) # 读文件构建字典
  119. choice = input() # 输入操作选项
  120. judge(choice) # 根据输入调用功能函数