python 如何多次使用列表的内容列表,而每个值只使用一次?

42fyovps  于 2022-12-25  发布在  Python
关注(0)|答案(3)|浏览(167)

我对编程和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()的输出进行比较。我做错了什么?我如何才能实现这两个值的比较。谢谢你的帮助,圣诞快乐。:)

eivnm1vs

eivnm1vs1#

请记住,每次调用这些函数都会返回一个新的随机字符串,您似乎认为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个随机样本,而不重复。这是一个更好的计划。

tag5nh1u

tag5nh1u2#

请原谅我没有用python编写代码,所以我不知道发布实际代码的语法,但是我可以解释伪代码。
您不需要定义两个函数来完成从Person列表中选取值的相同工作。
尝试以下方法:

  • 定义一个函数personFunc()。此函数将从人员列表中返回一个随机值。并将其从列表中删除,以便无法再次拾取。
  • 如果你不想从列表中删除元素,还有第二种方法。

维护一个集合,类似于HashMap,用于存储值沿着布尔值。

PersonMap = {
    ("donkey", false),
    ("snake", false),
    ("a beaver", false)
}

当您从该Map中拾取一个值时,将其标记为true,表示该值以前已被使用过。

deikduxw

deikduxw3#

另一种选择是用相同的get_n_random_people自定义函数生成两个随机索引,而不是person1_funcperson2_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() + ". ")

在本例中,当输入num为2时,函数get_n_random_people可以为您提供2个人,尽管根据您作为输入传递的值,它可以通用为任意数量的人。

相关问题