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

时间:2013-11-13 20:36:00

标签: python string replace

我有这个刽子手问题,在这部分中,我试图用他们正确猜到的字符替换占位符'_ '。例如如果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 个答案:

答案 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