Принт не выводит результаты. Python
Я решаю задачку, и хочу вот посмотреть как она отрабатывает, но принт ничего не выводит. Пробовал просто через запятую joke склеивать и ide жаловалась. Сделал через формат: не жалуется, но не выводит.
КОД И ЗАДАНИЕ:
"""
5. Реализовать функцию get_jokes(), возвращающую n шуток, сформированных из трех случайных слов, взятых из трёх списков:
nouns = ["автомобиль", "лес", "огонь", "город", "дом"]
adverbs = ["сегодня", "вчера", "завтра", "позавчера", "ночью"]
adjectives = ["веселый", "яркий", "зеленый", "утопичный", "мягкий"]
Например:
# >>> get_jokes(2)
["лес завтра зеленый", "город вчера веселый"]
Документировать код функции.
Сможете ли вы добавить еще один аргумент — флаг,
разрешающий или запрещающий повторы слов в шутках (когда каждое слово можно использовать только в одной шутке)?
Сможете ли вы сделать аргументы именованными?
"""
from random import choice
nouns = ["автомобиль", "лес", "огонь", "город", "дом"]
adverbs = ["сегодня", "вчера", "завтра", "позавчера", "ночью"]
adjectives = ["веселый", "яркий", "зеленый", "утопичный", "мягкий"]
list_1 = []
def get_jokes(n, flag = False):
for i in range(n):
random_index = choice(nouns)
random_index_1 = choice(adverbs)
random_index_2 = choice(adjectives)
joke = "{} {} {}".format(random_index, random_index_1, random_index_2)
print(joke)
print(random_index)
list_2 = []
if flag == True:
list_2 = joke.split()
for i in range(len(nouns)):
for fun in list_2:
if nouns[i] == fun:
nouns.pop(i)
print(nouns)
get_jokes(3)
Можете помочь, почему результата нету и есть ли тут какие-то ошибки? Если будет желание, можете подсказать, как еще можно сделать всю эту тему с флагом, только не сложным путем, я новичек.
Ответы (3 шт):
Ответ на дополнительный вопрос в комментариях, почему выходит ошибка:
for i in range(len(nouns)):
for fun in list_2:
if nouns[i] == fun:
nouns.pop(i)
Вы итерируетесь по списку, при этом удаляя из него элементы. В конце-концов у вас i оказывается за пределами списка, потому что список стал размером меньше, чем len(nouns) из-за этих удалений.
Это можно починить, например, так:
for n in nouns.copy():
for fun in list_2:
if n == fun:
nouns.remove(n)
Хотя по-хорошему это всё делается ещё проще с помощью вычитания множеств.
def get_jokes(n, flag=False):
jokes = []
for _ in range(n):
noun = choice(nouns)
adverb = choice(adverbs)
adjective = choice(adjectives)
if flag:
# или удаляйте выбранные слова из списка слов (плохой вариант, но если из копий, то - ок)
# или создавайте списки использованных слов и проверяйте, не было ли еще такого (может быть медленно на коротких списках)
# или составьте новую шутку и проверьте, нет ли ее в уже созданных (тоже может быть медленно)
# или перемешайте копии исходных списков и берите слова поочередно (лучший, на мой взгляд, вариант)
pass
jokes.append(f'{noun} {adverb} {adjective}')
return jokes
Я бы на вашем месте перепробовал бы всевозможные варианты уникализации;)
>>> print(get_jokes(3))
['город вчера яркий', 'дом сегодня утопичный', 'город ночью яркий']
Все сделано, вот без ошибок, спасибо всем кто помог:
from random import choice
nouns = ["автомобиль", "лес", "огонь", "город", "дом"]
adverbs = ["сегодня", "вчера", "завтра", "позавчера", "ночью"]
adjectives = ["веселый", "яркий", "зеленый", "утопичный", "мягкий"]
list_1 = []
def get_jokes(n, flag=False):
for i in range(n):
random_index = choice(nouns)
random_index_1 = choice(adverbs)
random_index_2 = choice(adjectives)
joke = f'{random_index} {random_index_1} {random_index_2}'
list_2 = []
print(joke)
if flag == True:
list_2 = joke.split()
for noun in nouns:
for fun in list_2:
if noun == fun:
nouns.remove(noun)
for adverb in adverbs:
for fun in list_2:
if adverb == fun:
adverbs.remove(adverb)
for adjective in adjectives:
for fun in list_2:
if adjective == fun:
adjectives.remove(adjective)
get_jokes(n=3, flag=True)