如何判断字符串是否在列表中并避免单复数同根单词被重复收录
单复数单词互斥校验实现方案
核心思路是给单复数单词建立分组映射,用集合记录已经提交过的分组,只要同分组内的任意单词(单数/复数)被提交过,同组其他单词都会被拦截。
完整修改后代码
# 读取文件内的所有合法单词 with open('fruits.txt') as f: text = [line.strip().upper() for line in f] ans = [] # 存储正确答案 used_groups = set() # 记录已经提交过的单词分组,用分组标识判断是否重复 # 单复数映射表,单数为分组标识,值为对应的复数,新增单词直接更新此字典即可 fruit_mapping = { 'APPLE': 'APPLES', 'ORANGE': 'ORANGES', 'BANANA': 'BANANAS' } # 生成反向映射,方便通过复数找对应分组 reverse_fruit_mapping = {v: k for k, v in fruit_mapping.items()} # 此处可以按你的需求加循环输入逻辑,示例为单次输入逻辑 i = 0 input_answer = input(str(i + 1) + '. ').upper() # 首先判断输入是否为合法单词(在文件列表内) if input_answer in text: # 查找当前输入单词对应的分组标识 current_group = None if input_answer in fruit_mapping: current_group = input_answer elif input_answer in reverse_fruit_mapping: current_group = reverse_fruit_mapping[input_answer] # 判断分组是否已经被提交过 if current_group in used_groups: print("The word is repeated") else: # 分组未提交,将分组标记为已用,将答案加入结果列表 used_groups.add(current_group) ans.append(input_answer) print("Answer accepted") else: print("Invalid answer")
逻辑说明
- 单复数属于同一个分组,统一用单数作为分组标识,不管先输入单数还是复数,都会命中同一个分组校验
- 用
set类型存储已使用分组,查询时间复杂度为O(1),比列表查询效率更高 - 需要新增单词时,仅需要更新
fruit_mapping字典即可,无需修改其他校验逻辑
测试效果
- 输入
APPLE,答案被接受,ans加入APPLE,后续输入APPLES会提示重复,不加入列表 - 输入
APPLES,答案被接受,ans加入APPLES,后续输入APPLE会提示重复,不加入列表
内容的提问来源于stack exchange,提问作者Favored Luck
相关产品推荐
相关产品推荐

