好的,所以我在我的代码中遇到了这个部分。当我想要用户猜测的字母替换下划线字符串中的那个字母时,它会用该字母替换每个字母。我不知道该怎么办。这是代码。
def hangman(secret):
'''
'''
guessCount = 7
w = '_'*len(secret)
while guessCount > 0:
guess = input('Guess: ')
if guess in secret:
indices = indexes(secret, guess)
print(indices)
for i in range(len(indices)):
w = w.replace(w[indices[i]],secret[indices[i]])
print(w)
else:
guessCount = guessCount - 1
print('Incorrect.',guessCount,'incorrect guesses remaining.')
在第9行和第10行中指出我能做些什么的任何帮助都将不胜感激。
这是我之前在此函数中使用的第一个函数。
def indexes(word, letter):
'''returns a list of indexes at which character letter appears in word'
'''
indices = []
for i in range(len(word)):
if letter in word[i]:
indices.append(i)
return indices
答案 0 :(得分:1)
正在发生的事情是,第10行认为您想要将“_”替换为“guess”。代替:
for i in indices:
w = list(w)
w[i] = guess
w = ''.join(w)
print(w)
最有可能采用更优雅的方式来实现这一目标,而不是将w从字符串更改为列表,再从列表更改为字符串,但我无法想到它。
答案 1 :(得分:1)
修改循环以遍历索引的内容:
for i in indices:
w = w.replace(w[indices[i]],secret[indices[i]])
print(w)
否则,循环将从0执行到indices数组的长度,因为提到了范围。
此外,您可能希望将print语句移到for
循环之外。
答案 2 :(得分:0)
如果您使用w[indices[i]]
索引编号,w
包含_
。因此,您总是执行以下操作:w.replace('_', 'e')
和:
>>> help("".replace)
Help on built-in function replace:
replace(...)
S.replace(old, new[, count]) -> string
Return a copy of string S with all occurrences of substring
old replaced by new.
所以你得到:
>>> "_____".replace('_', 'e')
'eeeee'
@Vaiska提出了另一个好处,你正在计算索引的长度,而不是索引本身。所以你总是在计算0,1,2,3 ...
@Kyle Friedline有一个解决方案,另一个是建立一个新的字符串,一次取一个字符,无论是从猜测还是从秘密,取决于你是否在索引点。
答案 3 :(得分:0)
字符串在Python中是不可变的。因此,它不是用于表示单词的合适数据结构。在我看来,Kyle Friedline的方法可能是正确的方法。
def hangman(secret, guessCount=7):
assert guessCount > 0 # Never really good to hard code magic numbers.
w = ['_'] * len(secret) # Make 'w' a list instead because list is mutable
while guessCount > 0:
guess = input("Guess: ")
if guess in secret:
indices = indexes(secret, guess) # I'm guessing indexes is defined elsewhere?
for i in indices:
w[i] = guess # Make it explicit. secret[i] == guess anyway.
print("".join(w)) # Join w into a word
else:
guessCount -= 1 # More concise
print("Incorrect. ", guessCount, " incorrect guesses remaining.")
实施索引的一点建议:
def indexes(word, letter):
return [i for i, c in enumerate(word) if c == letter]
或者只需将对indexes()
的调用替换为:
indices = [i for i, c in enumerate(secret) if c == guess]