def isWordGuessed(secretWord, lettersGuessed):
'''
secretWord: string, the word the user is guessing
lettersGuessed: list, what letters have been guessed so far
returns: boolean, True if all the letters of secretWord are in lettersGuessed;
False otherwise
'''
score = 0
tot = len(secretWord)
for i in range(len(secretWord)):
for j in range(len(lettersGuessed)):
if (secretWord[i] == lettersGuessed[j]):
score +=1
if score == tot:
return True
else:
return False
对于大多数单词和猜测字母m得到正确的答案但是在提供sceretWord为mangosteen
并且字母猜到为['z', 'x', 'q', 'm', 'a', 'n', 'g', 'o', 's', 't', 'e', 'e', 'n']
时我的输出错误。
有什么建议,为什么?
答案 0 :(得分:3)
看起来你可以使用:
set(secretWord).issubset(lettersGuessed)
确定猜测是否包含秘密词中的所有字母。
答案 1 :(得分:0)
原因如下:
mangosteen
,e
中有两个相同的字符。你的代码遇到了两次,所以它增加了两个分数。 secretWord[i]
和lettersGuessed[j]
为e
时的总得分加起来为4
。
这是一个解决方案:
您只需使用set
检查是否存在任何唯一字母:
return all([True if i in set(g) else False for i in set(w)])
这使得功能更短:)
演示:
>>> g = ['z', 'x', 'q', 'm', 'a', 'n', 'g', 'o', 's', 't', 'e', 'e', 'n']
>>> w = 'mangosteen'
>>> score = 0
>>> all([i for i in set(w) if i in set(g)])
True
另一种方法是在找到想要的字母后直接打破内循环:
if secretWord[i] == lettersGuessed[j]
score +=1
break
希望这有帮助!
答案 2 :(得分:0)
我的最终答案应该适用于重复的字符,错误的字符等。关键是应该从猜到的字符列表中删除单词的每个字符;如果失败了,那个角色就没有猜到(通常就够了),我们应该返回False。
def isWordGuessed(secretWord, lettersGuessed):
guesses_left = list(lettersGuessed)
for character in secretWord:
try:
guesses_left.remove(character)
except ValueError:
return False # remove failed
return True # all characters succeeded
答案 3 :(得分:0)
def isWordGuessed(secretWord, lettersGuessed):
lst = []
for e in lettersGuessed:
if e in secretWord:
lst.append(e)
if len(lst) == len(secretWord):
return True
return False
我这样做了,它通过了所有案件。