我有一个列表,希望生成一个没有重复元素的有限个置换。
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
按顺序返回下一个值因此,永远不需要生成完整的排列列表;我们只取我们想要的数量。