我有一个列表,希望生成一个没有重复元素的有限个置换。

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

它是有效的,但我的列表不会有唯一的排列,或者至少我对它没有保证。
有办法吗?谢谢

最佳答案

只需使用islice,它允许您从iterable中获取许多元素:

from itertools import permutations, islice

n_elements = 1000

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

这将返回1000个置换的list
这样做的原因是permutations返回一个迭代器,迭代器是一个对象,它生成需要返回的值,而不是立即返回。因此,过程如下:
调用函数(在本例中为list)要求islice中的下一个值
islice检查是否返回了1000个值;如果没有,则要求从permutations中获取下一个值
permutations按顺序返回下一个值
因此,永远不需要生成完整的排列列表;我们只取我们想要的数量。

09-20 20:14