我正在做一个刽子手项目,我无法检查多个相同字母的单词,例如" elephant"
我目前的做法:
enter_number = int(input("Please enter an integer number (0<=number<10) to choose the word in the list:"))
chosen_word = words[enter_number]
ini_guess = "_"*len(chosen_word)
list_01 = list(ini_guess)
if letter_input in chosen_word:
for letter in chosen_word:
if letter == letter_input:
list_01.pop(chosen_word.index(letter_input))
list_01.insert(chosen_word.index(letter_input),letter_input)
print("The letter is in the word")
print("Letters matched so far:","".join(list_01))
答案 0 :(得分:0)
我尽量避免pop
和insert
,列表理解更容易理解:
此外,当您想要逐个替换字符串时,字符串不适合使用。最好使用一系列字符。
matches = ['_' for _ in chosen_word]
我不确定为什么在尝试实现hangman时让用户输入整数,你不想让他们猜字母吗?假设您收到用户的来信并将其命名为letter
:
mask = [x == letter for x in chosen_word]
现在你有一个布尔列表,如果这个位置的字母匹配则为True,否则为false。将匹配列表中的字母替换为:
for index, bool in enumerate(mask):
if bool == True:
matches[index] = letter
说出这个词是&#34; elephant&#34;并且他们猜到&#34; e&#34;,然后''.join(matches)
会打印'e_e_____'
。
答案 1 :(得分:0)
您使用in
对整个列表进行一次迭代,然后使用for
再次对其进行迭代,并在每次index
调用时再次迭代它。这不仅浪费性能,而且过于复杂,更容易出错。
事实上,几乎每次你认为你想要list.index
,你实际上都没有,因为你将遇到重复值的问题 - 正是你遇到的问题。如果您要求e
中的elephant
索引,则列表无法知道您是否需要2
而不是0
。知道这一点的唯一方法是跟踪索引,例如使用enumerate
函数。
因此,更好的解决方案是循环一次:
for i, letter in enumerate(chosen_word):
if letter == letter_input:
list_01[i] = letter_input
print("The letter is in the word")
print("Letters matched so far:","".join(list_01))
一旦你将它简化为这样,你就会注意到第二个问题:你正在打印&#34;这封信是在&#34;每次出现一次,而不仅仅是一次,而且你也打印了#34;到目前为止匹配的字母&#34;每次出现一次 - 这意味着根本没有,如果它根本没有出现。但现在如何解决这些问题应该更加明显。
如果您理解列表推导和zip
,可能更清楚地将其简化为更远:
list_01 = [letter_input if letter_input == letter else oldval
for oldval, letter in zip(list_01, chosen_word)]
答案 2 :(得分:0)
使用enumerate()获取索引处的索引和字母
if letter_input in chosen_word:
for i,letter in enumerate(chosen_word):
if letter == letter_input:
list_01[i] = letter_input
print("The letter is in the word")
print("Letters matched so far:","".join(list_01))