【问题标题】:random.choice not working when selecting from a dictionary value which is a list从作为列表的字典值中选择时,random.choice 不起作用
【发布时间】:2017-10-07 03:38:27
【问题描述】:

我正在制作一个程序来随机制作一个对事物有影响力的神,并对与原作相关的事物产生影响。相关部分是:

spheres = {'death': ['death', 'corpses', 'skulls', 'rot', 'ruin', 'the end']}
# Dictionary of the things gods have power over and the relevant things to do with them

class God(object):

  def __init__(self, sphere, associations, name):
    self.sphere = sphere
    self.associations = accociations
    self.name = name
# Chooses areas to have power over, hopefully making it less and less likely as the program goes on further      
  def get_association(self):
    chance_of_association = 0
    list_of_choices = []
    while random.randint(0, chance_of_association) == 0:
      choice = random.choice(list(spheres[self.sphere]))
      # this is the problem
      if random.randint(1, 2) == 1:
        chance_of_association += 1
      list_of_choices.append(choice)
    self.associations = list_of_choices

deity1 = God(random.choice(spheres), deity1.get_association, 'godname')

当我运行它时,我得到:

  File "program.py", line 22, in <module>
    deity1 = God(random.choice(spheres), deity1.get_association, 'godname')
  File "/opt/python-3.6/lib/python3.6/random.py", line 258, in choice
    return seq[i]
KeyError: 0

即使行中没有 list() 也会产生相同的错误。我怎样才能得到它

【问题讨论】:

  • 你的意思是random.choice(spheres['death'])
  • 如果不是,请解释您要做什么。 (您将dict 传递给random.choice,这没有任何意义。)

标签: python dictionary random


【解决方案1】:
import random

spheres = {'death': ['death', 'corpses', 'skulls', 'rot', 'ruin', 'the end']}
# Dictionary of the things gods have power over and the relevant things to do with them

class God(object):

  def __init__(self, sphere, name, associations = None):
    self.sphere = sphere
    #so associations are not allocated twice
    self.possible_associations = spheres[self.sphere] 
    self.associations = associations
    self.get_association()
    self.name = name
# Chooses areas to have power over, hopefully making it 
# less and less likely as the program goes on further      
  def get_association(self):
    chance_of_association = 0
    list_of_choices = []
    while random.randint(0, chance_of_association) == 0 and self.possible_associations:
      choice = random.choice(self.possible_associations)
      self.possible_associations.remove(choice)
      if random.randint(1, 2) == 1:
        chance_of_association += 1
      list_of_choices.append(choice)
    self.associations = list_of_choices

您不能在实例化过程中引用“diety1”并调用它的方法“get_association”,因为尚未创建对象。所以我们将方法调用转移到__init__ 运行时发生。而且我们必须更改 random.choice 来搜索字典中的键列表。

deity1 = God(random.choice(list(spheres.keys())), 'godname')

【讨论】:

  • 谢谢,这个解释很有道理
【解决方案2】:

您可以将行更改为

deity1 = God(random.choice(spheres['death']), deity1.get_association, 'godname')

但这也会产生另一个错误,所以请再次查看您的代码。

Traceback (most recent call last):
File "<input>", line 23, in <module>
NameError: name 'deity1' is not defined

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-11
    • 2014-11-13
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    相关资源
    最近更新 更多