我有一个列表,并希望生成有限数量的排列,没有重复的元素。
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不会有独特的排列,或者至少我没有保证。
有没有办法这样做?谢谢
只需使用islice
,它允许您从迭代中获取许多元素:
from itertools import permutations, islice
n_elements = 1000
list(islice(permutations(x), 0, 1000))
这将返回(第一个)1000个排列的list
。
这样做的原因是permutations
返回一个迭代器,它是一个生成值的对象,可以根据需要返回,而不是立即返回。因此,过程如下:
list
)要求islice
的下一个值islice
检查是否已返回1000个值;如果没有,它要求permutations
的下一个值permutations
按顺序返回下一个值因此,永远不需要生成完整的排列列表;我们只采取我们想要的数量。
你可以做:
i = 0
while i < Nb_of_Lists:
if createlist() not in list_of_lists:
list_of_list.append(createList())
else:
i -= 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”方法更快,内存效率更高