使用random.randint()从列表中按索引绘制元素时出现索引错误

时间:2018-06-30 07:46:12

标签: python python-3.x random

import random
fruits = ['Apple','Mango','Banana','Grapes','Guava']
random.seed(500)
low =0
high = len(fruits)
random_fruits = [fruits[random.randint(low,high)] for i in range(1000)]

这是我的代码,以下是我得到的错误?

IndexError:列表索引超出范围

2 个答案:

答案 0 :(得分:3)

函数random.randint会在由下限值和上限值所定义的范围内生成一个随机数,两者均包括:low <= x <= high。由于将high设置为len(fruits),并且最后一个列表索引实际上是len(fruits) - 1,因此如果random.randint产生高值,则可以获得超出范围错误的列表索引。

相反,可以通过更改high的定义来修改代码。

import random
fruits = ['Apple','Mango','Banana','Grapes','Guava']
random.seed(500)
low = 0
high = len(fruits) - 1
random_fruits = [fruits[random.randint(low,high)] for i in range(1000)]

答案 1 :(得分:0)

您正在调用一个函数1000次以获取1000个值。对于,您可以使用random.choices(iterable, k=nubmer of elements)来简化代码。

一个呼叫将为您提供来自源可迭代的1000个随机项目的列表:

import random

fruits = ['Apple','Mango','Banana','Grapes','Guava']
random.seed(500)
# reduced 1000 to 10 for output-brievity
random_fruits = random.choices(fruits,k=10) # no need to get 1000 times one element, get
                                            # 1000 back in one call is more efficient.

print(random_fruits)

哪个输出为:

['Grapes', 'Guava', 'Banana', 'Mango', 'Grapes', 'Mango', 'Guava', 'Mango', 'Banana', 'Grapes']

您给它提供了一个可迭代的计数,并以list的形式获得了随机绘制的随机绘制的结果。


时间:

import timeit

s = """import random
random.seed(500)
fruits=['Apple','Mango','Banana','Grapes','Guava']"""

timeit.timeit("k = [fruits[random.randint(0,4)] for _ in range(1000)]", 
              setup = s , number=100) 

0.11539360368355066

vs。

timeit.timeit("k = random.choices(fruits, k=1000)", 
              setup = s, number=100)

0.02338418321748037

这使random.choices(...)的使用速度提高了约5倍。