刽子手计划中的缺陷

时间:2016-09-20 17:44:16

标签: python

我需要编写一个简单的hangman函数,它接受一个字符串(正在猜测的单词)和一个字母列表(猜测的字母)。 这是我使用的代码:

$ git config alias.foo '!echo "$1"'
$ git foo bar
bar bar
$ git config alias.foo '!echo "$1" "$2"'
$ git foo bar qux
bar qux bar qux

代码通常有效,但我发现偶尔会输出错误的答案。例如,如果

def WordGuessed(Word, letters):
    if letters == []:
        return False
    else:
        for i in letters:
            if i not in Word:
                return False
        else:
            if i == letters[-1]:
                return True

在应该打印True时打印False。任何人都可以看到我的代码出错了吗?

2 个答案:

答案 0 :(得分:1)

一旦找到不在单词中的猜测字母,您就会返回False。在您的示例中,第一个字母不在单词中。

如果您循环浏览Word并检查每个字母是否在数组letters中,那么它会起作用:

def WordGuessed(Word, letters):
    if letters == []:
        return False
    else:
        for i in Word:
            if i not in letters:
                return False
        else:
            if i == Word[-1]:
                return True

# prints True
print(WordGuessed('durian', ['h', 'a', 'c', 'd', 'i', 'm', 'n', 'r', 't', 'u']))

# prints False, missing 'u'
print(WordGuessed('durian', ['h', 'a', 'c', 'd', 'i', 'm', 'n', 'r', 't']))

答案 1 :(得分:0)

@jonhopkins说得对:我们不应该检查这个单词是否包含所有猜到的字母,而应该检查所有单词的字母是否都被猜到了。

但是你的代码可以更清晰:

  • 如果您需要use negation检查list实例是否为空,

  • 如果我们已经else for else阻止了return,则意味着我们已经达到了break的可迭代结束或def WordGuessed(Word, letters): if not letters: return False else: for i in Word: if i not in letters: return False else: return True ,无需另外检查。

所以解决方案可以写成

def WordGuessed2(Word, letters):
    return set(Word).issubset(set(letters))

最后,由于我们只需要检查一次字母,我们就可以处理像sets

这样的独特字母集合
>>> word = 'durian'
>>> guessed_letters = ['h', 'a', 'c', 'd', 'i', 'm', 'n', 'r', 't']
>>> WordGuessed(word, guessed_letters)
False
>>> WordGuessed2(word, guessed_letters)
False
>>> guessed_letters.append('u')
>>> WordGuessed(word, guessed_letters)
True
>>> WordGuessed2(word, guessed_letters)
True

测试

.timers
| with_entries( select(.key|contains("KeywordA") ) )