簡體   English   中英

Python:從給定列表創建等長子列表的有效方法,允許重復且順序無關緊要

[英]Python: Efficient way to create equal length sublists from given list with repetition allowed and order does not matter

所以我有一個包含 151 個項目的列表,並且需要給定列表中長度為 6 的子列表,條件是允許項目重復並且順序無關緊要。 用於解釋的較短示例。

list_given = [1, 2]

possible_sublists = [
[1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 2],
[1, 1, 1, 1, 2, 2],
[1, 1, 1, 2, 2, 2],
[1, 1, 2, 2, 2, 2],
[1, 2, 2, 2, 2, 2],
[2, 2, 2, 2, 2, 2]
]

Not allowed sublists would be any permutation of the above solutions, like [1, 1, 1, 1, 1, 2] is the same as [1, 1, 1, 1, 2, 1].

起初我嘗試了一種遞歸方法,但堆棧很快變得非常深。
我已經實現了一個迭代解決方案,但是 for 循環必須完成151^6 = 1,18,53,91,15,88,401次迭代,而所需的是156 C 6(n+r-1 C r) = 18,16,16,99,556這使得1,18,35,74,98,88,845次浪費迭代並增加了時間復雜度。 我怎樣才能更有效地避免這些大量的計算? 最重要的是,我還必須確保沒有如上所述的重復團隊,因此 O(n) 時間復雜度會增加當前復雜度,其中n會隨着新子列表添加到 global_set 而發生變化。
當前算法

from collections import Counter
def make_teams(poke):
    global_set = []
    for i in poke:
        for j in poke:
            for k in poke:
                for l in poke:
                    for m in poke:
                        for n in poke:
                            temp = Counter([i, j, k, l, m, n])
                            if temp not in global_set:
                                global_set.append(temp)
    return global_set

正如您所指出的,有 18.16 個生物子列表(156!/6!150!)

祝你好運!

N=151
global_list = []
for i in range(N):                                                                                                                                                     
    for j in range(i,N):                                                                                                                                                   
        for k in range(j,N):                                                                                                                                                   
            for l in range(k,N):                                                                                                                                                   
                for m in range(l,N):                                                                                                                                                   
                    for n in range(m,N):                                                                                                                                                   
                        global_list.append([i,j,k,l,m,n])                                                                                                                       

print(global_list) 

使用itertools.combinations_with_replacement

list_given = [1, 2]
for combination in itertools.combinations_with_replacement(list_given, 6):
    print(combination)

->
(1, 1, 1, 1, 1, 1)
(1, 1, 1, 1, 1, 2)
(1, 1, 1, 1, 2, 2)
(1, 1, 1, 2, 2, 2)
(1, 1, 2, 2, 2, 2)
(1, 2, 2, 2, 2, 2)
(2, 2, 2, 2, 2, 2)

但請注意,當list_given有 151 個元素時,你會得到很多組合! 這就是為什么 example 迭代組合而不是將它們全部放在一個列表中的原因:結果列表對於 151 個元素來說將是巨大的。

暫無
暫無

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

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