Добавление «in list» в оператор if

#python

#python

Вопрос:

В настоящее время я нахожусь в процессе создания игры hangman. Моя проблема во 2-м цикле for, для x в списке слов. Предполагается, что этот цикл for проходит через список слов (в этом примере [‘H’, ‘E’, ‘L’, ‘L’, ‘O’]) и:

if x in newwordlist or x==guessedletter , затем x печатается в новый список

elif x not in newwordlist or x!=guessed letter , затем для этого значения печатается «-«.

Когда я набираю букву H в консоли в качестве угаданного письма. Список новых слов обновляется и становится [‘H’, ‘-‘, ‘-‘, ‘-‘, ‘-‘] потому что я указал в коде, что если x=guessedletter, то print .

Но, когда я перейду к следующему вводу, например, O. Новый список слов теперь [‘-‘, ‘-‘, ‘-‘, ‘-‘, ‘ О’]. Как мне сделать так, чтобы вместо этого он становился [‘H’, ‘-‘, ‘-‘, ‘-‘, ‘ О’].

Мой цикл for указывает, что если x находится в newwordlist, то распечатайте его, а если это не так, то не печатайте «-«. Почему он не помнит, что newwordlist содержит значение H и не должен заменяться тире. Вместо этого он должен вывести это значение.

 ALPHABET = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
            'V', 'W', 'X', 'Y', 'Z']

word = input()  # word player 2 is trying to guess
wordlist = list(word)  # word in list form
guessedletter = input()  # guessed letter
guesses = 6  # max amount of guesses

while guesses <= 6 and guesses > 0:
    newABC = []
    newABCstring = ('')
    for x in ALPHABET:
        if x != guessedletter:
            newABC.append(x)
            newABCstring = (newABCstring   str(x))
    print("Unused letters:"   " "   (newABCstring))
    ALPHABET = newABC

    newwordlist = []

    for x in wordlist:  # ['H', 'E', 'L', 'L', 'O']
        if x in newwordlist or x == guessedletter:
            newwordlist.append(x)
        elif x not in newwordlist or x != guessedletter:
             newwordlist.append('-')  # ['-', '-', 'L', 'L', '-']
    print(newwordlist)

    newwordliststring = ('')
    for x in newwordlist:
        newwordliststring = (newwordliststring   str(x))
        if len(newwordliststring) == len(newwordlist):
            print("Guess the word,"   " "   (newwordliststring))  # prints the guessedletter dashes in string form


    guessedletter = input()

   
  

Ответ №1:

«newwordlist = []» выполняется для каждой итерации в цикле while. Таким образом, даже если «H» установлено на предыдущей итерации, оно сбрасывается на [] .

У вас может быть newwordlist с элементом, инициализированным all на ‘-‘ вне цикла while. Каждый раз, когда игрок правильно угадывает букву, просто обновляйте этот список вместо добавления элементов в список.

 newwordlist = ['-' for x in wordlist]
while guesses > 0:
    # some code
    for idx, letter in enumerate(wordlist):
        if letter == wordlist[idx]:
            newwordlist[idx] = letter
    print(newwordlist)
    # remaining code   
  

Комментарии:

1. Я вижу, есть ли у меня способ поместить «newwordlist = []» внутри цикла for? При этом также настраивая его на вывод этого цикла for? Таким образом, я мог бы выполнять цикл с новым списком с помощью «H».

2. Ну, технически да, если вы сохраните состояние в другом месте. Но у вас должно быть что-то вне цикла, чтобы сохранять состояния.

Ответ №2:

Вы должны сделать следующее.

  1. поместите список новых слов вне цикла while
  2. просто замените индекс newwordlist внутри цикла for. Смотрите код ниже.

`

 ALPHABET = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
            'V', 'W', 'X', 'Y', 'Z']

word = input()  # word player 2 is trying to guess
wordlist = list(word)  # word in list form
guessedletter = input()  # guessed letter
guesses = 6  # max amount of guesses

#define the newwordlist outside while loop
newwordlist = ['-' for letter in word]
while guesses <= 6 and guesses > 0:
    newABC = []
    newABCstring = ('')
    for x in ALPHABET:
        if x != guessedletter:
            newABC.append(x)
            newABCstring = (newABCstring   str(x))
    print("Unused letters:"   " "   (newABCstring))
    ALPHABET = newABC

#     newwordlist = []

    for index, x in enumerate(wordlist):  # ['H', 'E', 'L', 'L', 'O']
        if x in newwordlist or x == guessedletter:
            #just replace the value in the newwordlist
            newwordlist[index] = x  
            #blow elif is not required
#         elif x not in newwordlist or x != guessedletter:
#              newwordlist.append('-')  # ['-', '-', 'L', 'L', '-']
    print(newwordlist)

    newwordliststring = ('')
    for x in newwordlist:
        newwordliststring = (newwordliststring   str(x))
        if len(newwordliststring) == len(newwordlist):
            print("Guess the word,"   " "   (newwordliststring))  # prints the guessedletter dashes in string form


    guessedletter = input()
  

`

Комментарии:

1. Это отличный ответ, который решает проблему, однако я должен следовать рекомендациям, установленным для программы, и это включает в себя отказ от использования функции enumerate .

2. enumerate просто дает вам значение индекса для цикла for. без enumerate вы не получите индекс итерированного значения. Не уверен, какой вариант использования здесь.

Ответ №3:

Возможно, вы захотите попробовать это и сравнить с вашим:

 class E(Exception): pass

A = []

for i in range(65, 91):
    A.append(chr(i))

w = []

for i in 'HELLO':
    w.append(i)

g = ['-'] * len(w)
d = {}

for i in w:
    d[i] = 0

print('Please guess the word :n%sn' % g)
while True:
    try:
        i = input('Guess letter/word: ').upper()
        if __debug__:
            if len(i) != 1 and i not in A:
                raise AssertionError('Only a single letter and ASCII permitted')
            else: raise E
    except AssertionError as e:
        print('n%s' % e.args[0])
        continue

    except E:
        if i in w:
            if i not in g:
                g[w.index(i, d[i])] = i
                d[i] = w.index(i)
                print(g)
            else:
                try:
                    g[w.index(i, d[i] 1)] = i
                    d[i] = w.index(i, d[i] 1)
                    print(g)
                except ValueError:
                    continue

        if w == g:
            print('You are great')
            break
  

Вывод:

 PS D:Python> python p.py
Please guess the word :
['-', '-', '-', '-', '-']

Guess letter/word: h
['H', '-', '-', '-', '-']
Guess letter/word: e
['H', 'E', '-', '-', '-']
Guess letter/word: l
['H', 'E', 'L', '-', '-']
Guess letter/word: l
['H', 'E', 'L', 'L', '-']
Guess letter/word: l
Guess letter/word: l
Guess letter/word: o
['H', 'E', 'L', 'L', 'O']
You are great