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