#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. Это может быть проблемой, но это не то, что вызывает его пустые списки.