簡體   English   中英

允許重復的列表的所有可能組合的排列數量增加

[英]Increasing number of permutations of all possible combinations of a list with repetitions allowed

我試圖了解如何使用 itertools 生成一個列表,其中包含列表元素的所有可能組合,但要選擇和包括重復的元素的大小會增加,但沒有成功。 我還想添加一個分隔符:

lis = ['a','b','c']
separator = '/'
total_number_of_combinations = 3
permutation_list = ['a','b','c', 'a/a', 'a/b', 'a/c', 'b/a', 'b/b', 'b/c', 'c/a', 'c/b', 'c/c',
                    'a/a/a', 'a/a/b', 'a/a/c', 'a/b/a', 'a/b/b', 'a/b/c', 'a/c/a', 'a/c/b', 'a/c/c'
                    'b/a/a', 'b/a/b', 'b/a/c', 'b/b/a', 'b/b/b', 'b/b/c', 'b/c/a', 'b/c/b', 'b/c/c'
                    'c/a/a', 'c/a/b', 'c/a/c', 'c/b/a', 'c/b/b', 'c/b/c', 'c/c/a', 'c/c/b', 'c/c/c']

該列表將具有len(lis)+len(lis)**2+len(lis)**3+...++len(lis)**n元素,其中n=total_number_of_combinations 我需要保持分隔符和 total_numbers_of_combinations 可變。

我需要在一個列表中將其作為過濾 pandas DataFrame 的條件進行檢查(我將檢查dt[dt.my_col.isin(permutation_list)]

我感謝任何幫助或指向重復的主題,甚至是關於如何正確 state 這個問題的解釋,因為我沒有找到任何回答這個問題的主題(也許我使用了錯誤的關鍵字......)。 也許還有來自另一個模塊的 function 這樣做,但我不知道。

更新:根據@Scott 的要求,這是我的真實案例:

lis = ['BRUTELE','COCKPIT EST', 'CIRCET']
separator = ' / '
total_number_of_combinations = 10

所以我的最終列表需要有 88572 個元素。

你在找這個嗎?

[ '/'.join([*a]) for i in range(1,3) for a in itertools.combinations_with_replacement('ABCDEF', i) ]

結果是:

['A', 'B', 'C', 'D', 'E', 'F', 
'A/A', 'A/B', 'A/C', 'A/D', 'A/E', 'A/F', 'B/B', 'B/C', 'B/D', 'B/E', 'B/F', 'C/C', 'C/D', 'C/E', 'C/F', 'D/D', 'D/E', 'D/F', 'E/E', 'E/F', 'F/F']

以下將為您提供 39 個條目:

['/'.join([*a]) for i in range(1,4) for a in itertools.product(['a','b','c'],repeat=i)]

請注意,您給定的參考文獻只有 35 個條目,因為缺少{'a/c/c', 'b/a/a', 'b/c/c', 'c/a/a'} 我看不出為什么這些丟失的邏輯,所以我假設你的列表有錯誤。

你想要的是一個產品,而不是一個組合。

lis = ["BRUTELE", "COCKPIT EST", "CIRCET"]
separator = " / "
total_number_of_combinations = 3

result = list(
    itertools.chain.from_iterable(
        (separator.join(a) for a in itertools.product(lis, repeat=i))
        for i in range(1, total_number_of_combinations + 1)
    )
)

assert result == ['BRUTELE', 'COCKPIT EST', 'CIRCET', 'BRUTELE / BRUTELE', 'BRUTELE / COCKPIT EST', 'BRUTELE / CIRCET', 'COCKPIT EST / BRUTELE', 'COCKPIT EST / COCKPIT EST', 'COCKPIT EST / CIRCET', 'CIRCET / BRUTELE', 'CIRCET / COCKPIT EST', 'CIRCET / CIRCET', 'BRUTELE / BRUTELE / BRUTELE', 'BRUTELE / BRUTELE / COCKPIT EST', 'BRUTELE / BRUTELE / CIRCET', 'BRUTELE / COCKPIT EST / BRUTELE', 'BRUTELE / COCKPIT EST / COCKPIT EST', 'BRUTELE / COCKPIT EST / CIRCET', 'BRUTELE / CIRCET / BRUTELE', 'BRUTELE / CIRCET / COCKPIT EST', 'BRUTELE / CIRCET / CIRCET', 'COCKPIT EST / BRUTELE / BRUTELE', 'COCKPIT EST / BRUTELE / COCKPIT EST', 'COCKPIT EST / BRUTELE / CIRCET', 'COCKPIT EST / COCKPIT EST / BRUTELE', 'COCKPIT EST / COCKPIT EST / COCKPIT EST', 'COCKPIT EST / COCKPIT EST / CIRCET', 'COCKPIT EST / CIRCET / BRUTELE', 'COCKPIT EST / CIRCET / COCKPIT EST', 'COCKPIT EST / CIRCET / CIRCET', 'CIRCET / BRUTELE / BRUTELE', 'CIRCET / BRUTELE / COCKPIT EST', 'CIRCET / BRUTELE / CIRCET', 'CIRCET / COCKPIT EST / BRUTELE', 'CIRCET / COCKPIT EST / COCKPIT EST', 'CIRCET / COCKPIT EST / CIRCET', 'CIRCET / CIRCET / BRUTELE', 'CIRCET / CIRCET / COCKPIT EST', 'CIRCET / CIRCET / CIRCET']                                      

但是,結果項目的數量是len(lis) ** total_number_of_combinations ,這可能在計算上很昂貴。 更好的方法是通過在分隔符處拆分並測試每個拆分字符串的成員資格來解析字符串。

暫無
暫無

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

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