2

我有这个刽子手问题,在这一部分中,我试图'_ '用他们正确猜到的字符替换占位符。例如secretWord = 'lettuce',如果他们猜到e了,我希望它通过 secretWord 并检查 e 是否在其中,然后将其替换'_ 'e,所以它返回 _ e_ _ _ _ e

我的代码是:

创建一个占位符字符串表示secretWord

so Far = '' 
for char in secretWord:
    soFar = soFar + '_ '

检查/用正确的字符替换占位符

for char in secretWord:
    if char in lettersGuessed:
    soFar.replace('_ ', str(char))
print soFar

但是在 pythontutor.com 中secretWord = 'lettuce'lettersGuessed = ['z', 'x', 'q', 'l', 'e', 't', 't', 'u', 'c', 'e']我的输出是:

    _ _ _ _ _ _ _ 
    l l l l l l l 
    l l l l l l l
    l l l l l l l 
    l l l l l l l 
    l l l l l l l 
    l l l l l l l 
    l l l l l l l 

所以基本上,它看到的l是猜测的字母,因为它应该替换'_ '为那个字符,所以它替换了所有的字符。但我只想让它这样做一次(如果它再次出现,则secretWord再次这样做)。然后它不能替换任何其他字符,因为它们都不是'_ '......

4

4 回答 4

2

replace当您尝试替换某个位置的字符时,您不想使用;仅当您要替换与某个值匹配的所有索引处的所有字符时。

在索引处替换字符的方法是切片:

soFar = soFar[:index] + newChar + soFar[index+1:]

在这种情况下,secretWord 中的每个字符都匹配soFar 中的两个字符,因此您必须将它们加倍:

soFar = soFar[:index*2] + newChar + soFar[index*2+1:]

但是你怎么知道索引?不是通过调用index字符串——这将有同样的问题,返回具有该值的第一个字符的索引,而不是你想要的那个。使用该enumerate功能为您记数:

for index, char in enumerate(secretWord):

正如 kevinsa5 建议的那样,如果您使用列表而不是字符串,则可以使这更简单:

soFar = []
for char in secretWord:
    soFar.append('_')

现在,替换只是:

soFar[index] = char

但是,如果您将其打印为字符串,它将看起来像['_', '_']而不是_ _. 要将它变成一个漂亮的字符串,您需要使用以下join方法:

print ' '.join(soFar)
于 2013-11-13T20:39:24.630 回答
1

使用列表,而不是字符串:

soFar = [char if char in lettersGuessed else '_' for char in secretWord]
print(' '.join(soFar))

此外,最好lettersGuessed是 aset而不是 a list。由于您只关心集合中的成员,因此lettersGuessed只包含唯一项目是合适的。

于 2013-11-13T20:42:29.927 回答
0

现在的方式是,您将每一个'_'字母替换为出现在secretWord. 所以,当猜到l的时候,每一个都_l.

你可以做什么:

for index, char in enumerate(secretWord):
    if char in lettersGuessed:
    soFar = soFar[:index-1]+char+soFar[index+1:]
print soFar
于 2013-11-13T20:40:14.463 回答
0

虽然 abarnert 已经给了你一个巧妙的解决方案,

我通过跟踪“unguessed_letters”和使用“maketrans”来解决这个问题

解决方案:

from string import maketrans    
def process_guess(secret_word, unguessed_letters, guess):
    if guess in secret_word:
        unguessed_letters = unguessed_letters.replace(guess, '')
    trantab = maketrans(unguessed_letters, "_"*len(unguessed_letters))
    return secret_word.translate(trantab), unguessed_letters

使用演示:

secret_word = "lettuce"
unguessed_letters = secret_word
lettersGuessed = ['z', 'x', 'q', 'l', 'e', 't', 't', 'u', 'c', 'e']
for i in lettersGuessed:
    secret_mask, unguessed_letters = process_guess(secret_word, unguessed_letters, i)
    print secret_mask

执行输出:

$ python j.py 
_______
_______
_______
l______
le____e
lett__e
lett__e
lettu_e
lettuce
lettuce
于 2013-11-13T22:27:31.417 回答