【问题标题】:Python:Is there any way to remove an item from a list (random) after it has been used? Or change results of random.choice [duplicate]Python:有没有办法在使用后从列表中删除一个项目(随机)?或更改 random.choice 的结果 [重复]
【发布时间】:2016-10-23 22:43:41
【问题描述】:

我真的不知道如何问这个问题,而且我可能听起来很愚蠢。我一直在寻找解决我一直遇到的问题的方法,但我尝试过的一切都没有奏效。 我正在为我的计算机科学课程做一个项目,作为我的期末考试,该项目从姓名、生日、城市、地址等列表中随机生成一个身份(旁注:我的老师实际上并没有教我任何东西;我们阅读笔记并进行了由笔记中的定义组成的测验,当我们无法弄清楚某些事情时,他只是告诉我们问邻居。而且,这是我在这里的第一篇文章,所以如果格式不正确,并且我的编码能力很差,我提前道歉。)无论如何,我会继续我的问题。

在程序开始时,它会询问您是否要生成男性或女性身份:

def get_info():

global gender
global name
gender=input("Enter a gender of which you would like to randomly generate M=male F=female:")  
if gender==("F"):
    name=fname
elif gender==("M"):
    name=mname
else:
    print("Please enter either an M or F.")
    get_info()

然后它使用它来确定名称来自哪个列表:

fname=random.choice(list(set(["girlynames","tina","caroline","etc"])))

mname=random.choice(list(set(["guynames","richard","earl","etc"])))

然后它会打印出一个随机的身份,包括姓名、生日等,如下所示:

Your new identity is: 
Nathaniel Ellis
Your birthday is :
September 5 1985
Your address is :
470 MacMurray Acres

我在程序的主要部分之后添加了一个功能,如果他们想再次使用该程序,它会询问用户输入。

def retry():

again=input("Would you like to generate another? Y/yes N/no: ")
if again==('Y'):
    get_info()
    generate_identity()
    retry()

elif again==('N'):
    print("Thanks for using the identity generator! Have a spectacular day")
    quit()

问题是,每次我输入“Y”和性别时,它都会得到与第一次完全相同的结果,即使是不同的性别,除了名字之外所有结果都是相同的。

Your new identity is: 
Ava Ellis
Your birthday is :
September 5 1985
Your address is :
470 MacMurray Acres

我觉得有一个简单的解决方案,但我从这个网站(以及其他来源)阅读和尝试的所有内容都没有奏效。 有没有办法在使用后从列表中删除项目?还是让它每次结果都不一样?或者甚至是一种重置 Python 的方法,因为它只是伪随机的?我已经为此困扰了 3 天,它将于下周一到期,而我一直在这里 stackoverflow 试图找到解决方案,因为我注意到了这个问题。非常感谢您的帮助,您将成为救生员! :)

【问题讨论】:

  • 你是如何生成地址的?您忘记发布代码的那部分。
  • @Burhan 对于地址,它使用与名称生成器相同的概念,除了门牌号和生日/年份。对于那些,我有 random.randint。

标签: python string list random


【解决方案1】:

如果您每次启动程序时都将seed 设置为一个随机数,那么您的 random.choice 选项每次都会有所不同?

import random
seed = random.randint(0,9999)
random.seed(seed)

【讨论】:

    【解决方案2】:

    您可以使用pop 从列表中删除随机项目。

    selection = random.choice(range(len(name_list)))
    name = name_list.pop(selection)
    

    这会从name_list 中选择一个随机项目,将其移除,并将其分配给name

    也就是说,您的随机选择似乎工作正常,但您没有正确重新分配 name 的值。但是您需要发布更多代码才能确定。仔细检查 retry 运行后,您是否按照顺序重新分配 fname/mname 并将其重新分配给 name。

    【讨论】:

    • 起初,我在理解这个解决方案时遇到了麻烦,但最终,我想通了,现在它完全按照我想要的方式工作了!这正是我正在寻找的,我很欣慰,我得到了这么快的答复!非常感谢 rurp
    • 太棒了!很高兴我能帮上忙。
    • :) 我忘了添加这个,但是有什么办法可以用 random.randint 数字来做吗?我有这个 bdayear=random.randint(1970,1999) 来生成出生年份,但我不能使用上面显示的相同的东西,还有一个简单的解决方案吗?
    • 当然,将年份设置为列表,years = [x for x in range(1970, 2000)]。然后使用years,就像我上面使用的name_list
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多