Замена того же элемента в списке, который повторяется - PullRequest
0 голосов
/ 05 октября 2018

Я пытаюсь заменить элемент в списке несколько раз.В заменяемом списке уже были заменены все буквы пробелами, и я использую список ссылок, чтобы найти правильные местоположения, чтобы я мог заменить элементы списка, не разрушая основной список.

Например,

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 голосов
/ 06 октября 2018

Оказалось, что было очень простое решение, которое я пропустил:

for letter in range(len(letters_in_word)):
    if letters_in_word[letter] == guess:
        replaceable_list[letter] = guess
    joined_letters = " ".join(replaceable_list)

Я не знал, что мог бы установить этот простой параметр диапазона для использования вместо всех операторов for.Чем больше вы знаете!

Спасибо всем за предложения, но, к сожалению, я только начал изучать Python 2 недели назад и едва понял половину опубликованных предложений.Спасибо за попытку, хотя, я ценю это.

0 голосов
/ 05 октября 2018

Вы можете реализовать вспомогательную функцию, которая принимает ваше скрытое слово и ваши использованные буквы.Функция должна заменить любое «-» на правильную букву, если она будет угадана, и впоследствии вернуть ее.

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
0 голосов
/ 05 октября 2018

вы можете использовать отдельный список, чтобы отслеживать правильный ответ.Я не проверял это, но что-то вроде:

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
0 голосов
/ 05 октября 2018

Подход 1 (рекомендуется)

вы можете создать словарь, в котором ключом будут буквы вашего ответа, например, для 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', '_', '_']

Подход 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

'''
0 голосов
/ 05 октября 2018

Вы можете попробовать следующее, используя числовые сравнения:

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 местоположениям определенное значение в списке вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...