带2个通配符的Scrabble单词匹配函数返回错误结果求助
Scrabble单词匹配问题修复方案
问题根源
你的代码有两个核心问题导致返回全词典单词:
- rack字母列表未每次重置:
rack_letters在循环处理第一个单词时就被修改(移除字母),后续所有单词都在空/残缺的rack上检查,自然全部通过。 - 无匹配失败终止机制:当单词中出现rack里没有的字母且无通配符时,仅执行
pass,没有标记该单词无效,导致for-else的else分支始终触发,把所有单词加入有效列表。
修复后的主匹配函数
from wordscore import * def run_scrabble(rack): rack_low = rack.lower() valid_words = [] with open("sowpods.txt","r") as infile: raw_input = infile.readlines() data = [datum.strip('\n').lower() for datum in raw_input] for word in data: # 每次检查单词时,复制原始rack的字母列表,避免修改原始数据 rack_copy = list(rack_low) word_valid = True for letter in word: if letter in rack_copy: rack_copy.remove(letter) elif '*' in rack_copy: rack_copy.remove('*') elif '?' in rack_copy: rack_copy.remove('?') else: # 遇到无法匹配的字母,标记单词无效并终止循环 word_valid = False break if word_valid: valid_words.append([score_word(word), word]) valid_words.sort(reverse=True) for entry in valid_words: print((entry[0], entry[1])) print("Total number of words:", len(valid_words))
关键修复点说明
- 每次循环复制rack副本:用
rack_copy = list(rack_low)在每个单词检查前重新生成原始rack的字母列表,保证每个单词都基于初始输入的字母组验证。 - 增加有效性标记:用
word_valid变量跟踪当前单词是否能匹配,遇到无法匹配的字母时直接设为False并跳出字母循环。 - 替换for-else为条件判断:直接用
if word_valid来决定是否加入有效列表,逻辑更清晰,避免for-else的隐式触发问题。 - 提前统一转换单词为小写:读取词库时直接把单词转成小写,减少后续重复转换。
测试输入hare后,就能得到你预期的19个有效单词列表了。
后续通配符支持的优化提示
当前修复已经兼容*和?通配符,但要注意:
- 可以限制通配符的使用数量(比如最多2个),在初始化
rack_copy时先统计通配符数量,匹配时消耗计数而不是直接移除。 - 通配符匹配时,计分需要按照对应规则调整(比如Scrabble中通配符代表的字母不计分,可在
score_word函数中增加判断逻辑)。
内容的提问来源于stack exchange,提问作者gaurav8936
相关产品推荐
相关产品推荐

