2014-11-03 2 views
0

Я делаю палача PROJEC, и я имею проверку слова с несколькими буквами identicle, такие как «слон»заменить символы в списке

мой текущий способ сделать это проблемы:

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

Определите «проблемы». В чем ваша проблема? –

+0

AFAIK, в игре палача, если вы угадываете письмо, не заполняете ли вы все пробелы, куда приходит письмо? Вам не нужно отображать письмо в его пустое место в случае нескольких событий. – Beginner

ответ

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

После того, как вы упростили это так, вы заметите вторую проблему: вы печатаете «Письмо в слове «один раз за каждый раз, когда он появляется, а не один раз, и вы также печатаете« Письма, сопоставленные до сих пор »один раз за каждый раз, когда он появляется, а это значит совсем не, если он вообще не появляется. Но теперь должно быть намного более очевидным, как исправить эти проблемы.

Если вы понимаете, списочные и zip, это может быть еще более ясным, чтобы упростить его дальше:

list_01 = [letter_input if letter_input == letter else oldval 
      for oldval, letter in zip(list_01, chosen_word)] 
0

Я стараюсь избегать pop и insert, список понятий более прост в использовании:

Кроме того, строка не работает, когда вы хотите заменить их буквой. Лучше со списком символов.

matches = ['_' for _ in chosen_word] 

Я не знаю, почему у Вас есть данные, введенные пользователем целое число, когда вы пытаетесь реализовать палач, вы не хотите, чтобы отгадать? Скажем, вы получите письмо от пользователя и именем его letter:

mask = [x == letter for x in chosen_word] 

Теперь у вас есть список булевых, Правда, если письмо соответствует в этой позиции, и ложь в противном случае. Заменить буквы в списке совпадений с:

for index, bool in enumerate(mask): 
    if bool == True: 
     matches[index] = letter 

Произнесите слово было «слон», и они догадались, «е», то ''.join(matches) напечатает 'e_e_____'.

0

Используйте Перечислим(), чтобы получить как индекс и буква в индексе

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)) 
Смежные вопросы