函数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'
}而不是-
个字符。
答案 0 :(得分:5)
list-comprehension
完全适合您想要做的事情。如果<{em> i
为secret
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', '-']