替换重复列表中的相同元素

时间:2018-10-05 03:18:02

标签: python list

我试图多次替换列表中的项目。可替换列表已经用空格替换了所有字母,并且我正在使用参考列表来查找正确的位置,因此我可以替换列表中的元素而不会破坏主列表。

例如

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

5 个答案:

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

方法1(推荐)

您可以创建一个字典,其中的键将是答案的字母,例如appledict 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', '_', '_']

方法2(如果您坚持使用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,并且几乎不了解所发布的一半建议。谢谢您的尝试,对此我表示赞赏。