我想使用python创建n个随机10个数字列表,并将这些列表放在一个变量中(运行)。
以下是我的代码:
from random import shuffle
def gen_random_list (num):
ran = []
k = [n for n in range(1, 11)]
for i in range(num):
shuffle(k)
ran.append(k)
return ran
预期输出应该是这样的:
[[4, 3, 10, 2, 8, 5, 7, 9, 6, 1],
[1, 3, 9, 6, 10, 4, 2, 8, 5, 7],
[4, 1, 3, 2, 9, 7, 8, 5, 6, 10]]
然而,当我在jupyter笔记本中运行时,我得到了这个:
[[4, 1, 3, 2, 9, 7, 8, 5, 6, 10],
[4, 1, 3, 2, 9, 7, 8, 5, 6, 10],
[4, 1, 3, 2, 9, 7, 8, 5, 6, 10]]
这只是最后一个随机列表的重复。我已附上以下输出的屏幕截图。
screenshot in jupyter notebook
有人能告诉我问题在哪里吗?
感谢。
答案 0 :(得分:0)
Shuffle正在改变列表l
。您在列表列表中有多个相同列表的实例,因此它们可以同时进行洗牌。
要演示,请在循环中添加print
:
def init_par (pop_size):
''' generate the 1st generation of parents
pop_size should be an positive integer number'''
if not (isinstance(pop_size, int) and pop_size>1):
raise TypeError('bad operand type')
else:
par = []
l=list(range(1,11))
for i in range(pop_size):
print i,l, par
shuffle(l)
par.append(l)
return par
打印:
0 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] []
1 [9, 6, 5, 7, 2, 4, 3, 1, 8, 10] [[9, 6, 5, 7, 2, 4, 3, 1, 8, 10]]
2 [4, 5, 6, 2, 9, 3, 7, 8, 1, 10] [[4, 5, 6, 2, 9, 3, 7, 8, 1, 10], [4, 5, 6, 2, 9, 3, 7, 8, 1, 10]]
[[6, 8, 7, 1, 5, 4, 9, 3, 2, 10], [6, 8, 7, 1, 5, 4, 9, 3, 2, 10], [6, 8, 7, 1, 5, 4, 9, 3, 2, 10]]
由于par
中的每个条目只是同一个列表的一个视图,当你洗牌时,似乎来洗牌所有这些条目。
要修复,每次循环都会创建一个新列表:
def init_par (pop_size):
''' generate the 1st generation of parents
pop_size should be an positive integer number'''
if not (isinstance(pop_size, int) and pop_size>1):
raise TypeError('bad operand type')
else:
par = []
for i in range(pop_size):
l=list(range(1,11)) # each one is a new list
shuffle(l)
par.append(l)
return par
更快的方式是使用sample vs shuffle,如下所示:
def init_par (pop_size):
''' generate the 1st generation of parents
pop_size should be an positive integer number'''
if not (isinstance(pop_size, int) and pop_size>1):
raise TypeError('bad operand type')
else:
l=range(1,11)
return [sample(l, k=len(l)) for _ in range(pop_size)]