使用Python搜索拼字游戏中的单词列表与空白磁贴

时间:2017-12-05 20:17:44

标签: python

我有一个拼字游戏挑战并且有以下字母列表:

letters = ['t', 'u', 'v', 'w', 'x', 'y', 'z']

以下单词列表:

word = ['apple', 'whisky', 'yutz', 'xray', 'tux', 'zebra']

以下是我用来查找可以为给定字母列表创建的单词的代码:

def valid_word(word, letters):
    available_letters = letters[:]

    candidate = True

    for letter in word:
        if letter not in available_letters:     
            candidate = False
        else:
            available_letters.remove(letter)
    if candidate == True:
        return candidate

它为我提供输出,可以为当前的字母列表创建两个单词' yutz'和' tux '。

我的挑战是如果我们将字母中的一个字母替换为列表中标有'_'的空白,该怎么办?例如,'t'被下面的'_' 取代:

letters = ['_', 'u', 'v', 'w', 'x', 'y', 'z']

代码如何能够找到相同的单词'yutz'和'tux'但是替换丢失的字母?预期输出为'yu_z'和'_ux'。

更新

以下是我尝试过的代码,但这些代码并不完全有用,只是指示我要去的地方:

rack_list = []
    for letter in letters:
        if letter in string.ascii_lowercase:
            rack_list.append(letter)
        else:
            blank_count = user_input.count("_")

    def valid_word(word, rack):
    available_letters = rack_list[:]
    missed_counter = 0

    for letter in word:
        if letter in available_letters:     
            available_letters.remove(letter)
        else:
            missed_counter += 1
    if missed_counter <= blank_count:
        for i in word:
            if i in available_letters:
                word += i
            else:
                word += "_"
        return word

3 个答案:

答案 0 :(得分:4)

不要只是将candidate设置为False,而是保留一个错过了多少个字母的计数器。当该计数超过机架中的空白数量时,然后您取消该单词的资格。

另外,请注意if candidate == True是多余的。仅使用if candidate。该值已经是布尔值;没有必要对它进行测试。

每次OP增加尝试的代码更改:

你的主要问题是在循环中进行最后的打印;直到你检查了所有字母(完成循环),你不知道这个单词是否可能。

def valid_word(word, rack):
    available_letters = rack[:]
    blank_count = available_letters.count('_')
    # print available_letters, blank_count

    missed_counter = 0
    for letter in word:
        if letter in available_letters:         
            available_letters.remove(letter)
        else:
            missed_counter += 1

    # print word, missed_counter
    if missed_counter <= blank_count:
        print(word)


# Test program
rack = ['_', 'u', 'v', 'w', 'x', 'y', 'z']
lexicon = ['apple', 'whisky', 'yutz', 'xray', 'tux', 'xyzzy', 'zebra']

for word in lexicon: 
    valid_word(word, rack)

输出:

yutz
tux

答案 1 :(得分:1)

In [1]: def valid_word(word, rack_list):
 ...:     wrd = [w for w in word]
 ...:     for l in rack_list:
 ...:         try:
 ...:             wrd.remove(l)
 ...:         except:
 ...:             pass
 ...:     return len(wrd) <= ll.count('_')
 ...: 
In [2]: valid_word('tux', ['_', 'u', 'v', 'w', 'x', 'y', 'z'])
Out[2]: True

In [3]: valid_word('apple', ['_', 'u', 'v', 'w', 'x', 'y', 'z'])
Out[3]: False
In [4]: valid_word('apple', ['_', 'u', 'v', 'w', 'x', 'y', 'l', 'z', '_', 'p', '_', 'p', 'e'])
Out[4]: True

应该适合你

答案 2 :(得分:1)

可能有一个更有效的解决方案,但这个可行:

letters = ['_', 'u', 'v', 'w', 'x', 'y', 'z']

words = ['apple', 'whisky', 'yutz', 'xray', 'tux', 'zebra']

def valid_word(words, letters):
    not_valid = []
    valid = []
    wild = 0

    for letter in letters:
        if letter == '_':
            wild += 1

    for word in words:
        missing = 0
        for letter in word:
            if letter not in letters:
                missing += 1
                if missing > wild:
                    not_valid.append(word)
                    break
        if word not in not_valid:
            s = ''
            for letter in word:
                if letter in letters:
                    s += letter
                else:
                    s += '_'
            valid.append(s)

    return valid

print(valid_word(words, letters))

#output
['yu_z', '_ux']

因此,您创建了一个无效列表,一个有效列表和一个用于计算字母列表中下划线数量的常量变量。

然后循环你的话。如果单词中缺少的字母数大于wild计数的下划线数,请将该单词添加到无效列表中。否则,将其逐字母添加到您的有效列表中,用下划线替换任何缺失的字母。