替换列表中的字符

时间:2014-11-03 19:43:23

标签: python string list replace

我正在做一个刽子手项目,我无法检查多个相同字母的单词,例如" 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))

3 个答案:

答案 0 :(得分:0)

我尽量避免popinsert,列表理解更容易理解:

此外,当您想要逐个替换字符串时,字符串不适合使用。最好使用一系列字符。

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))