You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带2个通配符的Scrabble单词匹配函数返回错误结果求助

Scrabble单词匹配问题修复方案

问题根源

你的代码有两个核心问题导致返回全词典单词:

  1. rack字母列表未每次重置:rack_letters在循环处理第一个单词时就被修改(移除字母),后续所有单词都在空/残缺的rack上检查,自然全部通过。
  2. 无匹配失败终止机制:当单词中出现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 22:15:35