如何检测输入字符串是否在指定列表中及是否为重复答案变体
代码调整方案
原代码核心问题
- 存储已提交记录的
answer列表定义在循环内部,每次循环都会清空,之前的输入完全没有保留,自然无法完成重复判定。 - 重复判定逻辑错误:原有逻辑仅判断当前输入的完整字符串是否和之前输入完全一致,没有匹配输入包含的词根,无法实现输入
Heights触发Height重复判定的需求。 - 文件读取放在循环内部,每次循环重复读取相同文件,效率极低。
- 缩进逻辑错误,合法答案的存储分支触发条件错误。
修改后代码
# 提前读取合法答案、定义常量,避免循环内重复执行 with open('D:/VB/PRELIM/topic1.txt', 'r', encoding='utf-8') as f: valid_answers = set(f.read().strip().split()) # 预设词根列表 topic1 = ['SPIDER', 'HEIGHT', 'STRANGER', 'DYING', 'DARK','GHOST','SNAKE','ALONE','BOSS','FIRED'] # 存储已经提交过的词根 submitted_roots = [] index = 0 while index < 10: user_input = input(f"{index + 1}. ").upper() # 校验输入是否为合法答案 if user_input not in valid_answers: print("答案不合法") continue # 匹配当前输入包含的所有预设词根 matched = [root for root in topic1 if root in user_input] # 检查是否有词根已经被提交过 if any(root in submitted_roots for root in matched): print("You repeated your answer!") continue # 无重复则把当前匹配到的词根存入提交记录 submitted_roots.extend(matched) index += 1
逻辑说明
- 所有初始化逻辑移到循环外部,不会重复读文件,也不会清空提交记录。
- 每次用户输入后先匹配其包含的所有预设词根,只要有任意一个词根已经被提交过,就触发重复判定,完全符合你输入
Heights触发Height重复校验的需求。 - 用
with语句读取文件,自动释放资源,避免文件句柄泄漏。
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

