从文件中选择随机单词而不重复Python(集)

时间:2016-01-04 21:53:57

标签: python random set syntax-error text-files

我尝试创建一个程序,从包含10个以上单词的文本文件中选择10个单词。出于程序的目的,从文本文件导入这10个单词时,我不能两次导入相同的单词!目前我正在使用一套,但是我受到语法错误的欢迎。我对集合有一些了解,并知道它们不能两次保持相同的值。截至目前,我对如何解决这个问题一无所知,我们将非常感激。谢谢!

相关代码:(FileSelection)=打开文件对话框

def GameStage03_E():
    global WordSet
    if WrdCount >= 10:
        WordSet = set()
        for n in range(0,10):
            FileLines = open(FileSelection).read().splitlines()
            RandWrd = random.choice(FileLines)
            WordSet.update(set([RandWrd]))
        SelectButton.destroy()
        GameStage01Button.destroy()
        GameStage04_E()
    elif WrdCount <= 10:
        tkinter.messagebox.showinfo("ERROR", " Insufficient Amount Of Words Within Your Text File! ")

错误代码:

File "C:\Python34\lib\random.py", line 256, in choice
return seq[i]
`TypeError: 'set' object does not support indexing`

3 个答案:

答案 0 :(得分:2)

您可以使用random.sample2 / 3),这样您就不必自己动手了。您也不需要调用list bigblind的回答建议,因为random.sample可以将一个集合作为参数:

WordSet.update(random.sample(FileLines, 10))

这样,您可以用以下方法替换该函数的整个主体:

try:
    WordSet.update(random.sample(FileLines, 10))
except ValueError:
    stkinter.messagebox.showinfo("ERROR", "The text file doesn't have enough words!")

我也遗漏了你不需要的global陈述。只有当你为变量分配一个新值时才有必要,但你需要做的只是调用它的一个函数update

答案 1 :(得分:1)

这是因为random.choice正试图访问该集合,就好像它是一个列表(或实现__getitem__的其他一些数据结构)。要解决此问题,请将您的通话更改为random.choice

random.choice(list(FileLines))

这会将集合转换为列表,然后再将其传递给random.choice

答案 2 :(得分:1)

您可以使用random.sample(the_list, 10)来获取10个不同的元素,而不是反复尝试使用循环添加到集合中。