如何创建所有随机顺序的数组

时间:2019-01-06 02:37:31

标签: python python-3.x

我想创建一个数组,该数组存储n个数字上所有可能的排序。有什么有效的方法可以在Python 3中创建这样的数组吗?

例如,当n为20时,应该为20!此数组中的元素。

1 个答案:

答案 0 :(得分:3)

有效的方法,可能实用,不行。

生成内存中的列表效率不高,正如您所说的那样,列表的长度为20!个元素,每个元素都是20个项目的列表。假设每个元素的最佳情况是1个字节,并且没有开销,那么我们的数组将消耗20 x 20!个RAM字节,大约42 exabytes

@ user8408080建议使用一个生成器,该函数可以生成每个元素,但一次只能生成一个,因此可以对其进行处理而不必将整个列表存储在ram中,@ njzk2建议使用itertools,permutations方法可能会做您想要的:

itertools.permutations([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20])

或更简单地说:

itertools.permutations(range(1,21))

下一个问题,这将产生20个!结果,每秒处理10,000,000可能是可行的(尽管您还没有指定此列表将要执行的操作),因为这将花费20! / 10^7秒,大约需要7,000年。

假设有一个更“有效”的方法,我们可以减少这个数字,但是我认为它仍然不实用。

import itertools

def process(l):
    #Do some processing
    return l

def iterate_permutations(n):
    for l in itertools.permutations(range(1,n+1)):
        process(l)

iterate_permutations(10)

您可能必须考虑重新定义问题或对其进行优化,以便不必依次处理所有可能的排列。根据问题的不同,可能会有一些数学或逻辑原理可以帮助您。