我试图多次替换列表中的项目。可替换列表已经用空格替换了所有字母,并且我正在使用参考列表来查找正确的位置,因此我可以替换列表中的元素而不会破坏主列表。
例如
letters_in_word = list(apple)
for letter in letters_in_word:
letter_location = letters_in_word.index(letter)
for elements in replaceable_list:
if guess is letter:
replaceable_list[letter_location] = guess
但是,每当我一个接一个地猜所有字母(为学校项目制作游戏)时,代码中只会放置一个重复字母中的第一个字母。
输出:
_ p _ _ _
或
a p _ l e
如何设置代码以替换单词中列表中的每个重复项?
理想情况下,结果将是:
a p p l e
或
_ p p _ _
答案 0 :(得分:0)
您可以使用numpy比较尝试以下操作:
import numpy as np
letters_in_word = np.array(list('apple'))
guess = 'p'
replaceable_list = np.zeros_like(letters_in_word)
for letter in letters_in_word:
correct_guess = letters_in_word == guess
replaceable_list[correct_guess] = guess
>> ['' 'p' 'p' '' '']
用一种解释的方式,correct_guess
是一个布尔数组[False, True, True, False, False]
,指出guess
等于单词中的字母的位置。
然后,您可以使用此布尔表示形式在输出列表中为所有True
个位置分配一个特定值。
答案 1 :(得分:0)
您可以使用一个单独的列表来跟踪正确的答案。我还没有测试过,但是类似:
hangman = ['_', '_', '_']
answer = ['p', 'i', 'e']
...
#when guessed, do the following
for x in hangman:
for y in answer:
if guess == answer[y]:
hangman[y] = guess
答案 2 :(得分:0)
您可以创建一个字典,其中的键将是答案的字母,例如apple
,dict keys
是{a,p,l,e}
,现在我们要做的就是循环list = ['a', 'p', 'p', 'l', 'e']
idx =
'a( 0) p( 1) p(2) l ( 3) e( 4)'
并继续附加字母索引作为值。
完成此操作后,您的字典将看起来像{'a': [0], 'p': [1, 2], 'l': [3], 'e': [4]})
from collections import defaultdict
ans_list = list('apple')
replaceble_list = ['_']*len(ans_list)
guess = 'p'
char_idx_dict = defaultdict(list)
for idx,char in enumerate( ans_list):
char_idx_dict[char].append(idx)
if guess in char_idx_dict:
for idx in char_idx_dict[guess]:
replaceble_list[idx] = guess
print(replaceble_list)
# ['_', 'p', 'p', '_', '_']
list.index(x[, start[, end]])
ans_list = list('apple')
replaceble_list = ['_']*len(ans_list)
def get_indices_list( user_letter):
i = 0
idx_list = []
while i < len(ans_list):
try:
result = ans_list.index( user_letter, i, len(ans_list))
idx_list.append( result)
except ValueError:
break
i = result+1
return idx_list
chance_left = 5
while chance_left > 0:
guess = input('enter ').lower()
chance_left-=1
if guess in ans_list:
for idx in get_indices_list( guess):
replaceble_list[idx] = guess
print(replaceble_list)
if replaceble_list == ans_list:
print('you win')
break
else:
print('game over')
''' enter a ['a', '_', '_', '_', '_'] enter p ['a', 'p', 'p', '_', '_'] enter l ['a', 'p', 'p', 'l', '_'] enter e ['a', 'p', 'p', 'l', 'e'] you win enter t ['_', '_', '_', '_', '_'] enter u ['_', '_', '_', '_', '_'] enter p ['_', 'p', 'p', '_', '_'] enter o ['_', 'p', 'p', '_', '_'] enter l ['_', 'p', 'p', 'l', '_'] game over '''
答案 3 :(得分:0)
您可以实现一个帮助函数,该函数接受您的隐藏单词和使用过的字母。该功能将在猜出正确的字母后替换任何“-”,然后返回。
def get_hidden_word(hidden_word, used_letters):
"""Returns a string of the form __ad___ by filling in correct guesses"""
visible_word = ""
for letter in hidden_word:
if letter in used_letters:
visible_word += letter
else:
if len(visible_word) > 0 and visible_word[-1] == '_':
visible_word += " "
visible_word += "_"
return visible_word
答案 4 :(得分:0)
结果是我错过了一个超级简单的解决方案:
for letter in range(len(letters_in_word)):
if letters_in_word[letter] == guess:
replaceable_list[letter] = guess
joined_letters = " ".join(replaceable_list)
我没有意识到我可以设置这个简单的range参数来代替所有的for语句。你知道的更多!
感谢每个人的建议,但不幸的是,我只是在两周前才开始学习Python,并且几乎不了解所发布的一半建议。谢谢您的尝试,对此我表示赞赏。