Python 蟒蛇刽子手;至于;循环替换所有字符,而不仅仅是正确的字符

Python 蟒蛇刽子手;至于;循环替换所有字符,而不仅仅是正确的字符,python,loops,for-loop,replace,Python,Loops,For Loop,Replace,根据我对下面函数的理解,如果用户键入“z”,它应该循环遍历“zebra”中的每个字符如果字符与用户输入匹配,则应使用用户输入替换用户单词(空白单词)中的相应字符。否则,它应该什么也不做,继续循环使用“斑马”这个词 因此,如果用户猜到一个“z”,它应该识别出“z”是变量word中的字符0,然后用“z”替换user\u word(“\uuuuuuuuuuuuu”)中的字符0 相反,如果用户猜到任何正确的字母,它会用用户的输入替换“\uuuuuuuuuuuuuuuuuuuu”中的每个字符。所以,如果u

根据我对下面函数的理解,如果用户键入“z”,它应该循环遍历“zebra”中的每个字符如果字符与用户输入匹配,则应使用用户输入替换用户单词(空白单词)中的相应字符。否则,它应该什么也不做,继续循环使用“斑马”这个词

因此,如果用户猜到一个“z”,它应该识别出“z”是变量word中的字符0,然后用“z”替换user\u word(“\uuuuuuuuuuuuu”)中的字符0

相反,如果用户猜到任何正确的字母,它会用用户的输入替换“\uuuuuuuuuuuuuuuuuuuu”中的每个字符。所以,如果user_guess=“z”,user_word打印为“zzzzz”。如果他/她猜到了“e”,则用户的word打印为“eeeee”,以此类推

我已经一步一步地遵循了程序的逻辑,从纸面上看,它似乎应该是可行的。下面我做错了什么

我知道下面有太多的“if/else”语句,我确实打算将其中的一些语句压缩到单独的函数中(比如“correctguess()”函数)

word=“斑马”
刽子手(字):
用户_word=“_”*len(word)
不正确的猜测=[]
猜测失败=0
user_guess=getuser()
而用户_word!=单词和失败的猜测<10:
如果用户在word中猜测:
对于word中的字符:
如果char==用户猜:
user\u word=user\u word.replace(user\u word[word.index(char)],user\u guess)
其他:
猜测不正确。追加(用户猜测)
猜测失败+=1
打印“Word:”,用户\ Word
打印“遗漏的字母:”、“、”。加入(不正确的猜测)
user_guess=getuser()
如果用户猜==单词:
打印“太棒了,你成功了!你赢了!”
其他:
打印“那是十次尝试,你的兄弟被绞死了。你输了:()

问题出在这里:

for char in word:
    if char == user_guess:
        user_word = user_word.replace(user_word[word.index(char)], user_guess)
如果字符
char
确实是
user\u guess
的字符,那么
user\u word[word.index(char)]
将是下划线字符
,因此您调用:

user_word = user_word.replace('_',user_guess)
因此,这意味着您将用
用户猜测
替换所有下划线,而不管这些下划线是否位于
用户猜测
位于
word
的位置

您可以使用以下表达式代替
for
循环:

user_word = ''.join(w if w == user_guess else u for u,w in zip(user_word,word))
其工作原理如下:字符串是可编辑的。如果您围绕字符串编写循环,您将对字符进行迭代。通过使用
zip
,我们构造了两个可编辑的元组。因此,在这里,初始运行将生成
(''''z',(''u','e'),(''u','b'),(''u','r'),('u','a')
。对于这些元组中的每一个,我们在
u,w
中解压它们(因此第一次迭代
u='.'
w='z'

然后,如果w==user\u guess else u,我们使用三元运算符
w。三元运算符将检查
word
的字符
w
是否与
user\u guess
相同。在这种情况下,我们知道用
w
替换字符,否则我们将产生
u

因此,我们用这个表达式生成的iterable生成字符,我们将它们连接在一起

因此正确的程序是:

word = "zebra"

def hangman(word):

    user_word = "_" * len(word)
    incorrect_guesses = []
    failed_guesses = 0
    user_guess = getuser()

    while user_word != word and failed_guesses < 10:
        if user_guess in word:
            user_word = ''.join(w if w == user_guess else u for u,w in zip(user_word,word))
        else:
            incorrect_guesses.append(user_guess)
            failed_guesses += 1

        print "Word: ", user_word
        print "Letters missed: ", ', '.join(incorrect_guesses)
        user_guess = getuser()

    if user_guess == word:
        print "Awesome, you got it! You win!"

    else:
        print "That's ten tries, your dude is hanging from the gallows. You lose :("
.replace()的作用与您认为的不同
.replace
用第二个参数替换第一个参数的所有引用。因此,举个例子:

"sentence".replace("e", "z")
将提供:

"szntzncz"
您希望在程序中执行的操作是,当循环遍历每个
字符时,将该字符的索引替换为
字符

若要替换字符串的索引,需要将其转换为具有
list()
的列表,然后更改所需的
索引,然后最终转换回具有
''的字符串。join()

所以这句话:

user_word = user_word.replace(user_word[word.index(char)], user_guess)
应改为:

user_word = list(user_word)
user_word[word.index(char)] = user_guess
user_word = ''.join(user_word)
这将使您在5个下划线中正确放置
z


也可能值得考虑将单词作为
chars
存储在列表中,因为这意味着您不必在每次猜测字母时都进行转换。如果您将其存储在列表中,您只需记住打印:
”。在为用户显示时加入(用户单词)
。)

您知道
replace
的作用吗?它将替换第一个参数的所有引用。因此,如果第一个参数是
它将替换所有下划线。Willem,我没有意识到-我认为如果第一个参数作为索引输入字符串,它将只替换该索引。有办法做到这一点吗?Pravitha V,getuser()是一个单独的函数,它获取用户的输入(一个字母),并检查它是否是有效的条目。如果不是,则会提示用户输入另一个值。我想把它放在一个单独的函数下会更干净。对不起,关于这个错误,我弄糊涂了,认为字符串在
muatable
中!我现在通过转换为列表,更改索引项,然后转换回字符串来修复它。谢谢!因此,如果我理解正确,更改字符串中单个元素的最佳方法是将单词转换为列表,然后重新分配值。@Max:我们不会将其转换为列表。字符串是可编辑的:如果对其进行迭代,将获得字符。我们将它们与
单词
一起压缩,并检查
单词
字符是否对应于输入字符。如果有,我们使用该字符,否则我们使用“旧”字符。我们将这些角色连接在一起。
user_word = user_word.replace(user_word[word.index(char)], user_guess)
user_word = list(user_word)
user_word[word.index(char)] = user_guess
user_word = ''.join(user_word)