Как я могу использовать список содержимого списка несколько раз, но каждое значение только один раз?

Я очень новичок в программировании и 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(). Что я делаю не так? Как я могу добиться, чтобы оба значения сравнивались. Спасибо за вашу помощь и счастливого Рождества. :)

Одно из решений состоит в том, чтобы поместить варианты в список и перетасовать его, а затем вызывать .pop() в списке всякий раз, когда вы хотите выбрать элемент из него, что удалит элемент, чтобы его нельзя было выбрать снова.

John Gordon 24.12.2022 21:12
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
52
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Помните, что КАЖДЫЙ вызов одной из этих функций возвращает новую случайную строку. Кажется, вы думаете, что 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.

Попробуйте следующий подход:

  • Определите функцию personFunc(). Эта функция вернет случайный значение из списка лиц. И удалить его из списка, чтобы он не мог быть выбранным снова.
  • Если вы не хотите удалять элементы из списка. Eсть второй подход.

Поддерживайте коллекцию, что-то вроде 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, хотя она обобщается для любого количества людей в соответствии со значением, которое вы передаете в качестве ввода.

Другие вопросы по теме