从文件中选择不重复的随机单词 Python(套)
Choosing random words from a file without duplicates Python (sets)
我正在尝试创建一个程序,从包含 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`
发生这种情况是因为 random.choice
试图像访问列表一样访问集合(或实现 __getitem__
的其他数据结构)。要解决此问题,请将对 random.choice
的调用更改为:
random.choice(list(FileLines))
这会将集合转换为列表,然后再将其传递给 random.choice
。
您可以只使用 random.sample(the_list, 10)
来获取 10 个不同的元素,而不是反复尝试使用循环添加到集合中。
您可以只使用 random.sample
(2/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
.
我正在尝试创建一个程序,从包含 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`
发生这种情况是因为 random.choice
试图像访问列表一样访问集合(或实现 __getitem__
的其他数据结构)。要解决此问题,请将对 random.choice
的调用更改为:
random.choice(list(FileLines))
这会将集合转换为列表,然后再将其传递给 random.choice
。
您可以只使用 random.sample(the_list, 10)
来获取 10 个不同的元素,而不是反复尝试使用循环添加到集合中。
您可以只使用 random.sample
(2/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
.