Цикл for в моей последней функции, похоже, не выполняется. Я закодировал примерную версию, и она работала просто отлично, поэтому я не понимаю проблемы

#python #list #function #for-loop

Вопрос:

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

 from random import choice
import re
from time import sleep
from nltk.corpus import words

# This code takes user word and creates list of separate letters
user_letters = []
def get_letters():
   acrostiche = input("Enter your word here: ").upper()
   for letter in acrostiche:
      user_letters.append(letter)

# This code finds a random word for each letter in list user_letters
beginning_words = list()
user_letters2 = user_letters
def get_words_to_start_lines():
   while len(user_letters2) > 0:
      for letter in user_letters2:
         lettered_words = list(re.findall(letter   r".*", words.raw("en")))
         word = choice(lettered_words)
         lettered_words.clear
         break
      beginning_words.append(word)
      user_letters2.remove(letter)

# this code should generate a list of phrases user_letter is for beginning_word for each letter and word
phrases = list()
user_letters3 = [i for i in user_letters]
beginning_words2 = [ i for i in beginning_words]
def beginning_phrases():
   while len(user_letters3) > 0 and len(beginning_words2) > 0:
      for word in beginning_words2:
         for letter in user_letters3:
            phrase = letter   "is for"   word
      user_letters3.remove(letter)
      beginning_words2.remove(word)
      phrases.append(phrase)
   print(phrases)

get_letters()
print(user_letters)

get_words_to_start_lines()
print(beginning_words)
sleep(2)

beginning_phrases()
 

Вот некоторые примеры выходных данных:

 Enter your word here: hi
['H', 'I']
['Hierochloe', 'Ita']
[]
 

Последние две скобки представляют названный список phrases , как вы можете видеть, к нему ничего не было добавлено. Опять же, я попытался записать простой пример в отдельный файл, который работал, которым я поделюсь ниже.

 numbers = ['1', '2', '3']
words = ['cat', 'dogs', 'mice']
phrases = []
def example():
    while len(words) > 0 and len(numbers) > 0:
        for w in words:
            for n in numbers:
                phrase = n   w
        numbers.remove(n)
        words.remove(w)
        phrases.append(phrase)
    print(phrases)

print(numbers)
print(words)
example()
 

Пример вывода для этого выглядит следующим образом:

 ['1', '2', '3']
['cat', 'dogs', 'mice']
['3mice', '2dogs', '1cat']
 

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

1. user_letters2.remove(letter) это удаление писем из user_letters . user_letters2 это не копия, это тот же список.

2. Я попытался сделать две копии списка user_letters, используя два метода: user_letters2 = [i для i в user_letters] и user_letters3 = user_letters.copy (), но оба они также возвращают пустые списки.

3. Это не имеет значения, но lettered_words.clear ничего не делает, так как оно отсутствует () . Но нет необходимости очищать список между итерациями.

4. Спасибо за вашу помощь, мне удалось отсортировать его, создав копию списка внутри каждой функции, а не за ее пределами, и спасибо за предупреждение об опечатке. Я ценю это.

5. Вы устанавливаете user_letters3 и beginning_words2 перед вызовом функций , которые заполняют user_letters и beginning_words , поэтому вы делаете копии пустых списков.

Ответ №1:

В дополнение к ответу выше, строка user_letters2.remove(letter) выходит за рамки цикла for, который определяет letter .

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

1. Циклы Python не создают новую область.

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

3. Это может быть проблемой, но это не то, что вызывает его пустые списки.