Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在字典中插入一个随机元素,并在调用它时将其随机化?_Python_Python 2.7_Dictionary_Random - Fatal编程技术网

Python 如何在字典中插入一个随机元素,并在调用它时将其随机化?

Python 如何在字典中插入一个随机元素,并在调用它时将其随机化?,python,python-2.7,dictionary,random,Python,Python 2.7,Dictionary,Random,我正在写一个Facebook机器人,它最终会每天产生几个随机生成的状态。现在,我正处于从字典条目中选择短语的逻辑阶段,我已经编写了它,因此它暂时只能在Python shell中工作——Facebook身份验证的东西将在稍后出现 但是现在,我认为在字典中包含的短语中随机排列某些名词会很酷,我使用random.choice()执行此操作,并运行一个函数,该函数应该在每次生成状态时返回一个新的随机元素。但问题是,每当我调用这个短语时,我都能看到它生成了一个随机名词,但这个名词由于某种原因变得“固定”,

我正在写一个Facebook机器人,它最终会每天产生几个随机生成的状态。现在,我正处于从字典条目中选择短语的逻辑阶段,我已经编写了它,因此它暂时只能在Python shell中工作——Facebook身份验证的东西将在稍后出现

但是现在,我认为在字典中包含的短语中随机排列某些名词会很酷,我使用
random.choice()
执行此操作,并运行一个函数,该函数应该在每次生成状态时返回一个新的随机元素。但问题是,每当我调用这个短语时,我都能看到它生成了一个随机名词,但这个名词由于某种原因变得“固定”,因此每次都会重复相同的随机名词。当我运行函数作为构建状态的一部分时,它似乎运行得很好,但由于某种原因,我无法理解,任何新的随机名词都不会传递到字典。当然,当我重新启动程序时,它会工作,但是如果我打算作为一个机器人来做这件事,我最好不要每次我想要一个新的状态时都重新启动程序

我已经做了一些调查,我认为问题不在于我实际的
random.choice()
东西或它们所包含的函数,而是在我的random名词函数能够接触到它之前,字典已经“修复”(例如,random choice函数从水果列表中生成一个随机选择,但只有在我运行StatusBuilder函数时,字典才会选择相同的水果).我已经尝试了一些全局变量等的潜在解决方案,但没有任何效果。我认为下面代码中的摘录是最接近我的

from random import randint
from random import choice
from textwrap import fill

def RandomFruit():
    return choice(["mango", "pomelo", "guava", "grapefruit", "watermelon"])

class DoTable():
    def __init__(self, text):
        self.text = text

DoDict = {
    "do0": DoTable("sitting on the roof, completely naked, throwing Herb Alpert records at a dog like they were frisbees"),
    "do1": DoTable("eating a " + RandomFruit() + " like it's a handfruit"),
    "do2": DoTable("lurching around a supermarket"),
    }

class BeTable():
    def __init__(self, start_text, end_text):
        self.start_text = start_text
        self.end_text = end_text

BeDict = {
    "be0": BeTable("I guess ", " is what my life has come to."),
    "be1": BeTable("", ", just waiting for the police to arrive."),
    "be2": BeTable("If ", " is wrong, then I don't ever want to be right!"),
    }

def StatusBuilder():
#DoDict and BeDict will always have one entry selected from each, though
#BeDict will always have two attributes selected as part of the one entry.
    DoRNG = randint(0,len(DoDict)-1)
    BeRNG = randint(0,len(BeDict)-1)
#Logic to display concatenated strings
    status = BeDict["be" + str(BeRNG)].start_text + DoDict["do" + str(DoRNG)].text + BeDict["be" + str(BeRNG)].end_text
#print the status with textwrapping and with the first letter always capitalised.
    print fill((status[0].capitalize() + status[1:]), 80)
    print
    Controls()

def Controls():
    command = raw_input("([RETURN] FOR ANOTHER ROUND OF BULLSHIT, [Q] TO QUIT): ")
    if command.lower() == "q":
        quit()
    elif command.lower() == "":
        print
        RandomFruit()
        StatusBuilder()
    else: 
        print
        print fill("Some kind of wise guy are you? Try again, this time with a PROPER command please.", 80)
        print
        Controls()

#Start the program
print "PHILBOT V1.0"
print "A social media status generator."
print
command = raw_input("(PRESS [RETURN] TO GET STARTED): ")
print
RandomFruit()
StatusBuilder()
示例字典包含在上面的代码中(这是一个大规模精简版本的程序,如果您想玩它,它将运行)。因此,我遇到的问题是DoDict中的元素带有键“do1”。例如,假设StatusBuilder函数选择相同的短语(“do1”和“be2”)连续地,我希望它在每次使用StatusBuilder函数调用时产生不同的结果,如下所示:

“如果像吃水果一样吃芒果是错误的,那么我永远都不想做对!”

“如果像吃水果一样吃葡萄柚是错误的,那么我永远都不想做对!”

目前,无论我在StatusBuilder()中运行哪个水果,它都会永久“粘住”,即使RandomFruit()函数似乎工作正常

编辑:我现在尝试了一些建议的替代方案(使用lambdas和生成器),并尝试使用更简单的数据格式(没有类的列表),但问题仍在重现。因此,我开始认为这更多地与我的操作顺序有关,因为在最初运行RandomFruit函数后,字典条目会被“写入”(耶!),但当我再次运行它时,它不会被“重新写入”(boo!)…这给了我一个问题,因为我可以先声明函数,然后声明字典(函数首次使用后似乎没有与字典对话),或者先声明字典,然后声明函数(由于字典试图依赖尚未声明的函数,因此无法工作).因此,我认为这是问题的根源-有什么帮助吗?

您可以将该函数用作字典中的值(我已将您的示例简化了很多):

这样,每次访问字典时,您都会随机得到一个水果:

>>> for i in range(10): print DoDict['do1'](fruits)
guava
pomelo
watermelon
mango
watermelon
grapefruit
pomelo
watermelon
watermelon
watermelon
您也可以使用生成器

def random_fruit():
    while True:
        yield random.choice(["mango", "pomelo", "guava", "grapefruit", "watermelon"])
DoDict = {'do1': random_fruit().next}
在这种情况下,不需要将水果列表作为参数传递:

>>> for i in range(10): print DoDict['do1']()
grapefruit
pomelo
pomelo
guava
grapefruit
pomelo
pomelo
pomelo
mango
guava
您可以将该函数用作字典中的值(我已经将您的示例简化了很多):

这样,每次访问字典时,您都会随机得到一个水果:

>>> for i in range(10): print DoDict['do1'](fruits)
guava
pomelo
watermelon
mango
watermelon
grapefruit
pomelo
watermelon
watermelon
watermelon
您也可以使用生成器

def random_fruit():
    while True:
        yield random.choice(["mango", "pomelo", "guava", "grapefruit", "watermelon"])
DoDict = {'do1': random_fruit().next}
在这种情况下,不需要将水果列表作为参数传递:

>>> for i in range(10): print DoDict['do1']()
grapefruit
pomelo
pomelo
guava
grapefruit
pomelo
pomelo
pomelo
mango
guava

你能提供一个MCVE。向我们展示一个示例字典和你想要的预期输出。我现在的理解是,当你试图用一个键访问字典时,你想随机化字典的值,对吗?好的,好的想法,谢谢-将编辑帖子。我还应该说,程序已经随机化了字典是StatusBuilder()函数的一部分,但我想知道是否可以在StatusBuilder()调用字典条目之前,将其内容随机化为了让每个状态都变得新奇/不同。我可以添加具有不同水果名称的类似字典条目,但这感觉不太像python…你能提供一个MCVE吗。向我们展示一个示例字典以及你想要的预期输出。我现在的理解是,当你尝试创建一个用一个键访问它们,对吗?好的,好主意,谢谢-将编辑帖子。我还应该说,该程序已经将字典的值作为StatusBuilder()函数的一部分进行了随机化,但我想知道在StatusBuilder()调用字典条目之前,我是否也可以随机化字典条目的内容为了让每种状态都变得新奇/不同。我可以添加类似的字典条目和不同的水果名称,但这并不是什么好主意……我会尽快尝试这两种解决方案,它们看起来都很有希望,所以非常感谢你,当我尝试它们时,我会向你汇报!但是,首先要问一个问题-是num吗py在这里绝对必要?我完全不知道numpy做什么,以前没有使用过它,所以只是想知道除了现有的random.choice做事方式外,它还提供了什么…是的,numpy不是严格必要的,你可以使用random模块代替(我编辑了我的答案)