我使用random.randint生成一个随机数,然后将该数字赋给变量。然后我想打印带有我赋给变量的数字的行,但我一直收到错误:
列表索引超出范围
这是我试过的:
f = open(filename. txt)
lines = f.readlines()
rand_line = random. randint(1,10)
print lines[rand_line]
你想使用random.choice
import random
with open(filename) as f:
lines = f.readlines()
print(random.choice(lines))
这段代码是正确的,假设你打算将一个字符串传递给open
函数,并且你在dot之后没有空格......但是,要注意Python中的索引,即它从0开始而不是1,然后结束于len(your_list)-1
。
使用random.choice
更好,但如果你想遵循你的想法,它宁愿:
import random
with open('name.txt') as f:
lines = f.readlines()
random_int = random.randint(0,len(lines)-1)
print lines[random_int]
由于randint
包括两个边界,你必须看到len(lines)-1
。
f = open(filename. txt)
lines = f.readlines()
rand_line = random.randint(0, (len(lines) - 1)) # https://docs.python.org/2/library/random.html#random.randint
print lines[rand_line]
要获得随机行而不将整个文件加载到内存中,您可以使用Reservoir sampling(样本大小为1):
from random import randrange
def get_random_line(afile, default=None):
"""Return a random line from the file (or default)."""
line = default
for i, aline in enumerate(afile, start=1):
if randrange(i) == 0: # random int [0..i)
line = aline
return line
with open('filename.txt') as f:
print(get_random_line(f))
该算法使用O(n)
额外空间在O(1)
时间运行。