簡體   English   中英

列表python的有限排列

[英]Finite permutations of a list python

我有一個列表,並希望生成有限數量的排列,沒有重復的元素。

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返回一個迭代器 ,它是一個生成值以在需要時返回的對象,而不是立即返回。 因此,過程如下:

  1. 調用函數(在本例中為list )要求islice的下一個值
  2. islice檢查是否返回了1000個值; 如果沒有,它會從permutations請求下一個值
  3. 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”方法更快,內存效率更高

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM