我有一个拼字游戏挑战并且有以下字母列表:
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
答案 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计数的下划线数,请将该单词添加到无效列表中。否则,将其逐字母添加到您的有效列表中,用下划线替换任何缺失的字母。