Я очень новичок в программировании и python.
Я хочу создать "генератор плохих шуток". Я хочу составить несколько списков в виде кортежей, которые я заполняю контентом, и в конце он должен напечатать предложение, в котором он случайным образом выбирает из списков, чтобы создать суперплохие шутки. :) Все идет нормально. Мне удалось заставить его работать, но есть проблемы, с которыми я столкнулся. Я хочу, чтобы каждое значение из списка использовалось только один раз. Никогда дважды. Но я не знаю, чтобы сделать это.
Это мой проект до сих пор:
import random
person = ("donkey", "snake", "a beaver")
say1 = ("Where are my pants?", "Why do you look so sad?")
say2 = ("I don't know.", "That's what she said.")
place = ("bar", "restaurant", "hospital")
def person1_func():
person1 = person[random.randint(0, len(person)-1)]
return person1
def person2_func():
person2 = person[random.randint(0, len(person)-1)]
if person2 == str(person1_func()):
person2_func() #This should restart the function, if person2 and person1 are identical.
return person2
def place_func():
place1 = place[random.randint(0, len(person)-1)]
return place1
print(person1_func())
print(person2_func())
print("A" + person1_func() + " and a " + person2_func() + " come into a " + place_func() + ". ")
В функции person2_func() значение просто не сравнивается с выводом функции person1_func(). Что я делаю не так? Как я могу добиться, чтобы оба значения сравнивались. Спасибо за вашу помощь и счастливого Рождества. :)
Помните, что КАЖДЫЙ вызов одной из этих функций возвращает новую случайную строку. Кажется, вы думаете, что person1_func()
каждый раз будет возвращать одну и ту же строку.
Здесь вам не нужны две разные функции. Просто назначьте функцию одного человека, и пусть ВЫЗЫВАТЕЛЬ решает, как обращаться с дубликатами. Так:
import random
person = ("donkey", "snake", "a beaver")
say1 = ("Where are my pants?", "Why do you look so sad?")
say2 = ("I don't know.", "That's what she said.")
place = ("bar", "restaurant", "hospital")
def person_func():
return person[random.randint(0, len(person)-1)]
def place_func():
return place[random.randint(0, len(person)-1)]
per1 = person_func()
per2 = person_func()
while per1 == per2:
per2 = person_func()
place1 = place_func()
print(per1)
print(per2)
print("A " + per1 + " and a " + per2 + " come into a " + place1 + ". ")
ЗАМЕЧАНИЕ, однако, что это не очень хороший дизайн. Вы можете использовать random.choices
, чтобы выбрать N случайных выборок без дублирования из данной совокупности. Это лучший план.
Простите меня за то, что я не программирую на питоне, поэтому я не знаю синтаксиса для публикации фактического кода, но я могу объяснить псевдокод.
Вам не нужно определять две функции для выполнения одной и той же работы по выбору значения из списка Person.
Попробуйте следующий подход:
Поддерживайте коллекцию, что-то вроде HashMap для хранения ваших значений вместе с логическим значением.
PersonMap = {
("donkey", false),
("snake", false),
("a beaver", false)
}
И когда вы выбираете значение из этой карты, отметьте его как истинное, указывая, что это значение использовалось ранее.
Другой вариант — сгенерировать два случайных индекса с одной и той же пользовательской функцией get_n_random_people
вместо person1_func
и person2_func
. Такой подход позволит вам избежать дополнительных проверок среди выбранных людей.
import random
person = ("donkey", "snake", "a beaver")
say1 = ("Where are my pants?", "Why do you look so sad?")
say2 = ("I don't know.", "That's what she said.")
place = ("bar", "restaurant", "hospital")
def get_n_random_people(num):
return [person[rand_idx] for rand_idx in random.sample(range(0, len(person)), num)]
def place_func():
return place[random.randint(0, len(person)-1)]
people = get_n_random_people(2)
print(people[0])
print(people[1])
print("A" + people[0] + " and a " + people[1] + " come into a " + place_func() + ". ")
В этом примере функция get_n_random_people
может дать вам 2 человека, когда ввод num
равен 2, хотя она обобщается для любого количества людей в соответствии со значением, которое вы передаете в качестве ввода.
Одно из решений состоит в том, чтобы поместить варианты в список и перетасовать его, а затем вызывать
.pop()
в списке всякий раз, когда вы хотите выбрать элемент из него, что удалит элемент, чтобы его нельзя было выбрать снова.