hang子手游戏更新单list.python

问题描述:

我正在为游戏hang子手编写代码。我需要编写一个函数来获取:单词,当前模式和字母,并返回更新后的模式(如果该字母在单词中)。hang子手游戏更新单list.python

for example: update_word_pattern("apple", "_ _ _ l _", p) 
will return: ("_ppl_") 

我试着写代码,但我得到的错误信息:

" updated_pattern = pattern[:i] + letter[i] + pattern[i+1:] 
IndexError: string index out of range" 

这里是我的代码:

def update_word_pattern(word, pattern, letter): 
    for i in range(len(pattern) - 1): 
     if letter in word: 
      updated_pattern = pattern[:i] + letter[i] + pattern[i+1:] 
     print(updated_pattern) 
    else: 
     print(updated_pattern) 

update_word_pattern("apple", "_ _ _ _ _", "p") 

我真的不知道如何解决this.I会感谢一些帮助。提前致谢!

+0

你为什么要测试'if word in word:'for'for' loop?循环内不会有'letter'或'word'变化,所以每次测试都会得到相同的结果。另外,你需要考虑'pattern'中的空格。将'pattern'设置为与'word'相同的列表会更简单,并且在打印时添加空格,例如'pattern = ['_'] * len(word)',然后可以打印它通过做'print(''.join(pattern))' –

我不打算解决的功课你,但你的错误,你使用的是来源于这样的事实:

letter[i] 

len(letter) == 1,所以抛出你看到的错误(你可能想做letter而不是letter[i] ...)。

+0

谢谢。它确实摆脱了错误信息,但我得到的输出是错误的:_ _ _ _ p – Adamso

由于IDOS提到,您获得的IndexError因为letter[i]无效时i> 0,因为letter是一个字符的字符串。

你的函数的逻辑没有多大意义。 letterword都不会在函数内部发生变化,所以如果您想要执行if letter in word测试,在for循环中执行该操作有点愚蠢。然而,如果letter等于word的当前字符,那么真的需要在循环中测试

下面是您的代码的修复版本。

def update_pattern(word, pattern, letter): 
    for i in range(len(word)): 
     if word[i] == letter: 
      pattern = pattern[:i] + letter + pattern[i+1:] 
    return pattern 

# test 
word = "apple" 
pattern = '_' * len(word) 
for letter in 'petal': 
    print(letter) 
    pattern = update_pattern(word, pattern, letter) 
    print(' '.join(pattern), end='\n\n') 

输出

p 
_ p p _ _ 

e 
_ p p _ e 

t 
_ p p _ e 

a 
a p p _ e 

l 
a p p l e 

下面是在列表存储pattern更有效的方式:

def update_pattern(word, pattern, letter): 
    return [letter if w == letter else p 
     for w, p in zip(word, pattern)] 

# test 
word = "apple" 
pattern = ['_'] * len(word) 
for letter in 'petal': 
    print(letter) 
    pattern = update_pattern(word, pattern, letter) 
    print(' '.join(pattern), end='\n\n') 

它提供了相同的输出,以我以前的版本。