选择一个随机单词

时间:2015-03-07 22:46:11

标签: python-2.7 random word

有人会如何从众多列表中随机抽出一个字? Words.txt是一个单词文件,包含英语词典中的每个单词,用新行分隔。

1 个答案:

答案 0 :(得分:1)

您可以使用heapq通过为其提供随机密钥来有效地从文件中获取随机行,例如:

import random, heapq

with open('Words.txt') as fin:
    word, = heapq.nlargest(1, fin, key=lambda L: random.random())

我们使用heapq.nlargest的原因(我们可以使用heapq.nsmallest - 这是非常随意的)这是因为它的内存效率更高 - 我们只需要在内存中保留一行。它要么保持相同的行,要么在输入的每次迭代中被具有较高随机值的行替换。这与:

相反
from random import choice

with open('Words.txt') as fin:
    words = list.readlines()
word = choice(lines)

因此,在这种情况下,我们将所有单词加载到内存中。然后我们从列表中选择一个随机单词。如果你不得不继续选择单词并且在内存中包含所有单词都很好,那么这是一种更好的方法,因为在内存中随机选取一些内容会比每次线性扫描文件更有效。

简而言之,如果你知道你只想要一个随机字(假设你的程序只是想在启动时),那么使用第一种方法并避免内存开销,如果你想反复获取更多单词,请记忆点击并使用第二种方法。

当然,如果你知道你只需要100(在这里选择一个数字)随机单词,那么将参数调整为heapq.nlargest并从迭代中消耗,然后如果你用完了,那么决定什么做下一步。

import random, heapq

with open('Words.txt') as fin:
    words = heapq.nlargest(100, fin, key=lambda L: random.random())
    word_iter = iter(words)

然后,稍后在您的脚本中使用类似:

的内容
try:
    word = next(word_iter)
except StopIteration:
    # we've exhausted all our pre-loaded random words... 
    # either get more, fail, whatever...