为什么这个功能导致[' h' - ' - ',' - ',' - ',' - ']

时间:2017-12-08 17:36:07

标签: python list for-loop

函数hangman_guessed(guessed, secret)应该采用一串猜测的字符和一个" secret"字符。

该函数检查秘密列表中的每个字符,并将其与猜测字符串中的每个字符进行比较,以检查字符是否同时存在。如果字符不相同,则函数将-放在等于秘密列表的临时列表中(这样我们仍然可以将猜测列表中的其他字符与之后的原始秘密列表进行比较)。

def hangman_guessed(guessed, secret):
    modified = secret
    for i1 in range(len(secret)):
        for i2 in range(len(guessed)):
            if secret[i1] == guessed[i2]:
                modified[i1] = secret[i1]
                break
            else:
                modified[i1] = '-'
    return modified

例如,当我运行hangman_guessed('hl', ['h','e','l','l','o'])时,它应该返回['h', '-', 'l', 'l', '-'],但目前它会返回['h', '-', '-', '-', '-']

这里的问题是只考虑猜测列表中的第一个字符,但我不知道为什么。在这种情况下,预计程序会检查'l'中的['h','e','l','l','o'])个字符,并将临时列表modified中的相应字符设置为-,但据我了解在for循环再次运行并检查原始secret列表中l个字符后,它应覆盖-列表中的modified,结果应该为'l' }而不是-个字符。

1 个答案:

答案 0 :(得分:5)

list-comprehension 完全适合您想要做的事情。如果<{em> isecret i,我们希望在in 中创建每个字符的列表(guessed) em> else 我们想要一个连字符("-")。

def hangman_guessed(guessed, secret):
    return [i if i in guessed else "-" for i in secret]

以及显示其有效的测试:

>>> hangman_guessed('hl', ['h','e','l','l','o'])
['h', '-', 'l', 'l', '-']

随着你越来越习惯Python的流程,你会发现一般的理解非常有用,并且对于各种各样的东西都非常易读。

如果由于某种原因,您必须使用嵌套的for-loops并且不允许使用非常简单的in运算符,那么您需要/可以进行一些更正您当前的代码:

  • 首先制作secret列表的副本
  • 遍历guessed中的字符,而不是索引

完成这两项修正后,该功能将如下所示:

def hangman_guessed(guessed, secret):
    modified = secret[:]
    for i in range(len(secret)):
        for g in guessed:
            if secret[i] == g:
                modified[i] = secret[i]
                break
            else:
                modified[i] = '-'
    return modified

现在有效:

>>> hangman_guessed('hl', ['h','e','l','l','o'])
['h', '-', 'l', 'l', '-']