Как использовать два цикла for для случайной замены нескольких слов в предложении

#python-3.x #for-loop #random

#python-3.x #цикл for #Случайный

Вопрос:

Моим заданием было создать генератор случайных комплиментов, который использует два цикла for для случайного выбора и замены существительного и прилагательного в предложении. Предполагается, что я использую функцию random.choice для выбора существительного / прилагательного, а затем распечатываю предложение с заменами. Я сделал большую часть этого ниже, но по какой-то причине программа заменяет только существительное, но не прилагательное. Вместо этого он выводит предполагаемое прилагательное после заполнителя.

 import random

sentence = "Hi, your *noun is looking *adj today."
sentence = sentence.split()

nouns = ["son", "daughter", "dog", "house"]
adjectives = ["beautiful", "handsome", "pretty", "warm", "fantastic"]

indexCount = 0
for word in sentence:
    if word == "*noun":
        wordChoice = random.choice(nouns)
        sentence[indexCount] = wordChoice
    indexCount  = 1

    if word == "*adj":
        wordChoice = random.choice(adjectives)
        sentence[indexCount] = wordChoice

st = ""
for word in sentence:
    st  = word   " "
print(st)
  

Результат, который я продолжаю получать в режиме ОЖИДАНИЯ, похож на:

  Hi, your son is looking *adj warm 
  

Today вообще не распечатывается. Когда я пытаюсь добавить второй indexCount = 1 , программа возвращает, что он находится вне диапазона.

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

1. Сейчас самое время использовать enumerate

Ответ №1:

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

 if word == "*adj":
    wordChoice = random.choice(adjectives)
    sentence[(indexCount 1)] = wordChoice
  

Это объясняет, почему слово one после «* adj» изменяется. Вместо этого переместите приращение indexCount после проверки прилагательного.

Лучше использовать enumerate для получения индексации:

 for idx, word in enumerate(sentence):
    if word == "*noun":
        wordChoice = random.choice(nouns)
        sentence[idx] = wordChoice

    if word == "*adj":
        wordChoice = random.choice(adjectives)
        sentence[idx] = wordChoice
  

Также при построении ваших результатов вы также можете использовать join :

 st = " ".join(sentence)
  

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

1. Вау! перечислять было чем-то, чему меня вообще не учили. Так удобно не устанавливать значение indexCount равным 0 вручную. Я попробую это решение и свяжусь с вами.

2. Я попробовал метод enumerate, но я продолжаю получать сообщение об ошибке в строке с надписью sentence[idx] = wordChoice . В нем говорится, что wordChoice не определен.

3. @Dev ах, да, это была ошибка, теперь ее нужно исправить

4. Спасибо за вашу помощь! Теперь это работает отлично. Теперь я должен полностью понять это и иметь возможность использовать его в своей практической работе завтра. Спасибо за полезные советы по перечислению и объединению, они сэкономят мне много времени.

5. @Dev Рад помочь! Если этот вопрос был полезен, вы можете пометить его как принятый ответ, установив галочку рядом с ним.

Ответ №2:

Давайте пойдем проще:

 import random
nouns = ["son", "daughter", "dog", "house"]
adjectives = ["beautiful", "handsome", "pretty", "warm", "fantastic"]
  

Теперь простой оператор печати, хотя и длинный, очень прост в использовании:

 print "Hi, your", random.choice(nouns), "is looking", random.choice(adjectives), "today."
Hi, your dog is looking beautiful today.
  

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

1. Упс — Сначала я не получил требования к циклам for .

2. Спасибо за комментарий! Если бы мне не было поручено использовать циклы for, это, вероятно, то, что я бы выбрал. Это действительно просто, однако оно не удовлетворяет требованиям.