这是我的代码,我试图用0到6之间的7个数字填充列表,没有重复,每次都是随机顺序。这是我的代码,但我一直收到错误"列表分配索引超出范围",我不知道我的错误在哪里。这是我的代码:
import random
def generate():
listA = []
for x in range(0,6):
listA[x] = random.sample(range(6), 1)
generate()
print(listA)
答案 0 :(得分:5)
仅仅shuffle
range
的结果会更有效。
>>> from random import shuffle
>>>
>>> r = range(7)
>>> shuffle(r)
>>> r
[5, 3, 6, 4, 1, 0, 2]
请注意,在Python 3中,您必须将r
显式转换为列表:
>>> r = list(range(7))
答案 1 :(得分:1)
您可以使用random.shuffle。
list_ = list(range(7)) #a list from 0 to 6. list() not needed in Python 2
shuffle(list_)
print(list_)
但是,如果您的洗牌清单很大,您应该考虑:
注意,即使相当小的len(x),x的排列总数也大于大多数随机数生成器的周期;这意味着永远不会产生长序列的大多数排列。
所以你应该手动实现它:
yourlist = range(1000) #or a bigger number, or an arbitrary list
yournewlist = []
for i in range(len(yourlist)):
yournewlist.append(yourlist.pop(random.randint(0, len(yourlist)-1)))
注意我计算len(yourlist)
N + 1次。该值永远不应存储在变量中。第一个计算定义了迭代(在Python 2中,您可以使用xrange
而不是range
进行计数迭代)。以下迭代将具有不同的len(yourlist)
值(从N到1)。请记住,randint(lowerBound, uppweBound)
将包含upperBound,因此您应始终使用0和长度-1来获取有效的列表索引。这会影响许多其他语言,如Pascal,它们不包括整数随机函数的预期结果中的upperBound值。
记住:我描述的算法和使用os shuffle都会改变原始列表。我的阿尔格。将结果放在一个不同的列表中。
答案 2 :(得分:0)
要在列表末尾指定元素,请使用listA.append(…)
。
您要做的是替换不存在的广告位的值,这就是您获得IndexError
的原因。
另外,我很确定你只是想要listA = random.sample(range(6), 6)
。您所写的内容只是进行了6次单独的1元素采样,每次采样都没有重复 。
(或者,你可以写listA = range(6)
然后random.shuffle(listA)
。)