仅对具有重复字符的字符串中的一个字符使用.replace()

2024-03-28 16:21:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我遇到了这个hangman问题,在这一部分中,我试图用他们正确猜测的字符替换占位符'_ '。e、 如果secretWord = 'lettuce',并且他们猜到了e,我希望它遍历secretWord并检查其中是否有e,然后用e替换{},这样它返回 _ e_ _ _ _ e

我的代码是:

创建secretWord的占位符字符串表示形式

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

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

^{pr2}$

但是在pythontutor.com网站,其中secretWord = 'lettuce'和{}我的输出是:

    _ _ _ _ _ _ _ 
    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中的话)。然后它无法替换其他任何字符,因为它们都不是'_ '。。。。在


Tags: 字符串代码inforso字符形式far
3条回答

当您试图在某个位置替换一个字符时,您不想使用replace;它只适用于您要替换所有与某个值匹配的字符(在所有索引中)。在

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

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

在本例中,secretWord中的每个字符都匹配soFar中的两个字符,因此必须将它们加倍:

^{pr2}$

但是你怎么知道指数呢?不是通过对有相同问题的字符串调用index,返回具有该值的第一个字符的索引,而不是您想要的那个。使用enumerate函数为您继续计算:

for index, char in enumerate(secretWord):

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

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

现在,替代品只是:

soFar[index] = char

但是,如果将其作为字符串打印出来,它看起来像['_', '_'],而不是{}。要将其转换为一个漂亮的字符串,您需要使用join方法:

print ' '.join(soFar)

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

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

另外,最好将lettersGuessed设为set,而不是list。因为您只关心集合中的成员身份,lettersGuessed只包含唯一项是合适的。在

现在的方法是,将每个'_'替换为secretWord中出现的第一个猜测的字母。所以,当猜测的l时,它用l填充每个_。在

你可以做的是:

for index, char in enumerate(secretWord):
    if char in lettersGuessed:
    soFar = soFar[:index-1]+char+soFar[index+1:]
print soFar

相关问题 更多 >