我正在使用类似项目的刽子手,而如果用户输入一个字母并与解决方案匹配,它将替换与解决方案中字母位置相对应的特定星号。我试图通过在解决方案中获取该字母实例的索引然后替换星号中的匹配索引来实现此目的。
这里的事情是,当我使用var.index(字符)时,我只获得重复出现的字符的第一个实例,而我还必须替换该字母的另一个实例。这是代码:
word = 'turtlet'
astk = '******'
for i in word:
if i == t:
astk[word.index('i')] = i
这里它每次只替换't'的第一个实例。我怎么可能解决这个问题?
答案 0 :(得分:1)
index()
仅为您提供字符串中第一次出现的字符(技术上,子字符串)的索引。您应该利用enumerate()
。此外,您的猜测(隐藏单词)应该是一个列表,而不是字符串,因为字符串是不可变的并且不支持项目分配,这意味着如果用户的猜测正确,则无法显示该字符。然后,当您想要显示它时,可以join()
。这是一个非常简化的游戏版本,所以你可以看到它的实际效果:
word = 'turtlet'
guess = ['*'] * len(word)
while '*' in guess:
print(''.join(guess))
char = input('Enter char: ')
for i, x in enumerate(word):
if x == char:
guess[i] = char
print(''.join(guess))
print('Finished!')
答案 1 :(得分:0)
请注意,字符串类型的find
方法有一个可选参数,用于指示从何处开始搜索。因此,如果您确定字符串word
至少有两个t
,则可以使用
firstindex = word.find('t')
secondindex = word.find('t', firstindex + 1)
我相信你可以看到如何使其适应其他用途。
答案 2 :(得分:0)
我相信有更好的方法来执行特定的任务。
只需保留单词(或短语)本身,并在需要显示蒙版短语时,在此时计算它。以下代码段显示了如何执行此操作:
>>> import re
>>> phrase = 'My hovercraft is full of eels'
>>> letters = ' mefl'
>>> display = re.sub("[^"+letters+"]", '*', phrase, flags=re.IGNORECASE)
>>> display
'M* ***e****f* ** f*ll *f eel*'
请注意,letters
应该以您想要显示的字符开头(我的情况下的空格,但也可能包括标点符号)。在猜出每个字母时,将其添加到letters
并重新计算/重新显示屏蔽的短语。
正则表达式替换用{星号'替换letters
中不的所有字符。
答案 3 :(得分:0)
for i in range(len(word)):
if word[i] == "t":
astk = astk[:i] + word[i] + astk[i + 1:]