为什么这个函数导致['h',' - ',' - ',' - ',' - ']?

Joh*_*Doe 3 python for-loop list

该函数hangman_guessed(guessed, secret)应该采用一串猜测的字符和一个"秘密"字符列表.

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

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
Run Code Online (Sandbox Code Playgroud)

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

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

Joe*_*don 5

一个list-comprehension非常适合你想要做什么.我们要创建的每个角色的列表(让这个做i)的secret ,如果 iin guessed 其他人,我们希望有一个连字符("-").

def hangman_guessed(guessed, secret):
    return [i if i in guessed else "-" for i in secret]
Run Code Online (Sandbox Code Playgroud)

并且测试表明它有效:

>>> hangman_guessed('hl', ['h','e','l','l','o'])
['h', '-', 'l', 'l', '-']
Run Code Online (Sandbox Code Playgroud)

随着您越来越习惯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
Run Code Online (Sandbox Code Playgroud)

现在有效:

>>> hangman_guessed('hl', ['h','e','l','l','o'])
['h', '-', 'l', 'l', '-']
Run Code Online (Sandbox Code Playgroud)