我有这个刽子手问题,在这部分中,我试图用他们正确猜到的字符替换占位符'_ '
。例如如果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
中)。然后它无法替换任何其他角色,因为它们都不是'_ '
....
答案 0 :(得分: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)
答案 1 :(得分:1)
使用列表,而不是字符串:
soFar = [char if char in lettersGuessed else '_' for char in secretWord]
print(' '.join(soFar))
此外,最好让lettersGuessed
成为set
而不是list
。由于您只关心集合中的成员资格,因此lettersGuessed
仅包含唯一项目。
答案 2 :(得分:0)
现在的方式是,您使用'_'
中显示的第一个猜测字母替换每个secretWord
。因此,当猜到l
时,每个_
都填充l
。
你能做什么呢?
for index, char in enumerate(secretWord):
if char in lettersGuessed:
soFar = soFar[:index-1]+char+soFar[index+1:]
print soFar
答案 3 :(得分: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