列表python的有限排列

时间:2019-04-13 12:03:48

标签: python permutation itertools

我有一个列表,想生成有限数量的排列,没有重复的元素。

itertools.permutations(x)

给出所有可能的排序,但是我只需要特定数量的排列。 (我的初始列表包含〜200个元素=> 200!将花费不合理的时间,我不需要所有这些元素)

到目前为止我做了什么

def createList(My_List):
    New_List = random.sample(My_List, len(My_List))
    return New_List

def createManyList(Nb_of_Lists):
    list_of_list = []
    for i in range(0, Nb_of_Lists):
        list_of_list.append(createList())
    return list_of_list

它正在运行,但是我的List_of_list将没有唯一的排列,或者至少我对此没有任何保证。

有没有办法做到这一点?谢谢

3 个答案:

答案 0 :(得分:5)

只需使用islice,它就可以让您从可迭代对象中提取许多元素:

from itertools import permutations, islice

n_elements = 1000

list(islice(permutations(x), 0, 1000))

这将返回(第一个)1000个排列中的list

之所以可行,是因为permutations返回了 iterator ,这是一个对象,它会生成需要返回的值,而不是立即返回。因此,该过程如下所示:

  1. 调用函数(在这种情况下为list)从islice请求下一个值
  2. islice检查是否已返回1000个值;如果不是,它将从permutations
  3. 询问下一个值
  4. permutations按顺序返回下一个值

因此,永远不需要生成排列的完整列表。我们只取我们想要的数量。

答案 1 :(得分:1)

您可以这样做:

i = 0
while i < Nb_of_Lists:
    if createlist() not in list_of_lists:
        list_of_list.append(createList())
    else:
        i -= 1

这将检查该排列是否已被使用。

答案 2 :(得分:1)

您不需要滚动自己的排列。您只要够了就停止生成器:

# python 2.7
import random
import itertools
def createList(My_List):
    New_List = random.sample(My_List, len(My_List))
    return New_List

x = createList(xrange(20))
def getFirst200():
    for i, result in enumerate(itertools.permutations(x)):
        if i == 200:
            raise StopIteration
        yield result

print list(getFirst200()) # print first 200 of the result

这比“先生成全套然后先进行200次”方法更快,存储效率更高