Python从列表中的单词返回一个字母,但不是单词

时间:2017-01-09 08:05:46

标签: python

我有一个如下生成的列表:

#demographic


def race_list():
    demographic = []

    Dwarf_race = Dwarf_box.get()
    Elf_race = Elf_box.get()
    Human_race = Human_box.get()

    if Dwarf_race == 1:
        demographic.append("Dwarf")
    else: 
        pass
    if Elf_race == 1: 
        demographic.append("Elf")
    else: 
        pass
    if Human_race == 1: 
        demographic.append("Human")
    else: 
        pass
    return demographic

然后我有一个函数将调用此列表,从中进行随机选择,然后读取文件。像这样:

# gen_NPC.py
def run(demographic): 
    print(demographic) 
    set_race = random.choice(demographic).strip()
    print(set_race)

    gender = ['male', 'female']
    sex = random.choice(gender)
    first = open(set_race + '_' + sex + '.txt')
    name1 = first.readlines()
    first = random.choice(name1).strip()

    last = open(set_race + '_surnames.txt')
    name2 = last.readlines()
    last = random.choice(name2).strip()

    npcname = NPC(first, last)
    propname = npcname.name

    return propname, sex, set_race

在主脚本运行的整个过程中,该函数被多次调用(通过其他函数),这是由用户输入确定的。它确实有效,但set_race = random.choice(demographic).strip()有时会从列表中的一个单词返回一个字母,意味着文件无法打开,我得到类似的东西。

Exception in Tkinter callback
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py", line 1486, in __call__
    return self.func(*args)
  File "dnd_test.py", line 99, in MakeSettlement
    gen_market.run(num_market, demographic)
  File "/Users/username/Desktop/DnD/dndapp/DND_Beta_2.0/gen_market.py", line 9, in run
    gen_NPC.run(set_race)
  File "/Users/username/Desktop/DnD/dndapp/DND_Beta_2.0/gen_NPC.py", line 20, in run
    first = open(set_race + '_' + sex + '.txt')
IOError: [Errno 2] No such file or directory: 'l_male.txt'

我已经使用print(demographic)print(set_race)运行此功能来确认这一点。

知道为什么random.choice()会这样做?

1 个答案:

答案 0 :(得分:3)

要使set_race成为单个字符,demographic 必须已设置为单个字符串而不是列表。那时random.choice()从该字符串中选取一个随机字母:

set_race = random.choice(demographic).strip()

demographic取自调用run()函数时传入的参数,因此您需要查看代码调用该函数。你的追溯表明你是。你传入了一个字符串,而不是这一行的列表:

  File "/Users/username/Desktop/DnD/dndapp/DND_Beta_2.0/gen_market.py", line 9, in run
    gen_NPC.run(set_race)

该行传入set_race的事实似乎表明你在该函数之外选择了你的NPC种族,并试图将其传入。

您没有分享代码的这一部分,因此我们无法告诉您为什么set_race没有列表而是字符串。您显然没有使用race_list()返回的列表(该函数使用本地名称demographic也独立于run()中的名称。)