创建n个随机列表

时间:2018-02-05 19:36:51

标签: python list random append jupyter-notebook

我想使用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

有人能告诉我问题在哪里吗?

感谢。

1 个答案:

答案 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)]