2024-04-26 23:45:29 发布
网友
有没有一个内置的方法来做这件事?如果不是,我如何在不花费太多开销的情况下做到这一点
这取决于你所说的“太多”开销是什么意思。如果可以将整个文件存储在内存中,那么
import random random_lines = random.choice(open("file").readlines())
我会成功的
import random lines = open('file.txt').read().splitlines() myline =random.choice(lines) print(myline)
对于非常长的文件: 根据文件的长度在文件中随机放置,并在位置(或换行符和文件结尾)后找到两个换行符。若原始寻道位置为<;则在文件开头或之前重复100个字符;如果我们最后进了最后一排
但这太复杂了,因为文件是迭代器。所以请列出它并使用random.choice(如果需要很多,请使用random.sample):
import random print(random.choice(list(open('file.txt'))))
不是内置的,但是Knuth的《计算机编程的艺术》中的算法R(3.4.2)(Waterman的“水库算法”)很好(在一个非常简化的版本中):
R(3.4.2)
import random def random_line(afile): line = next(afile) for num, aline in enumerate(afile, 2): if random.randrange(num): continue line = aline return line
{}迭代器产生序列2,3,4。。。因此randrange将是0,概率为1.0/num——这是我们必须替换当前选择的行的概率(引用算法的样本大小1的特例——请参阅Knuth的书以获得正确性证明==当然,我们也有一个足够小的“库”来容纳内存;-))... 确切地说,就是我们这样做的概率
randrange
1.0/num
这取决于你所说的“太多”开销是什么意思。如果可以将整个文件存储在内存中,那么
我会成功的
对于非常长的文件: 根据文件的长度在文件中随机放置,并在位置(或换行符和文件结尾)后找到两个换行符。若原始寻道位置为<;则在文件开头或之前重复100个字符;如果我们最后进了最后一排
但这太复杂了,因为文件是迭代器。所以请列出它并使用random.choice(如果需要很多,请使用random.sample):
不是内置的,但是Knuth的《计算机编程的艺术》中的算法
R(3.4.2)
(Waterman的“水库算法”)很好(在一个非常简化的版本中):{}迭代器产生序列2,3,4。。。因此
randrange
将是0,概率为1.0/num
——这是我们必须替换当前选择的行的概率(引用算法的样本大小1的特例——请参阅Knuth的书以获得正确性证明==当然,我们也有一个足够小的“库”来容纳内存;-))... 确切地说,就是我们这样做的概率相关问题 更多 >
编程相关推荐