亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何找到所有可能的方法來組合列表中的項目而不重復?

如何找到所有可能的方法來組合列表中的項目而不重復?

米脂 2022-05-19 18:55:56
我有六個類別:A、B、C、D、E 和 F。我想找出所有可以組合類別的獨特方式,而無需重復。例如,如果我結合前三個類別,我將得到 A、A、A、B、C、D。如果我結合 B、C、D、E,我將得到 A、B、B、B、B、 C。我試過迭代工具。itertools.product 很接近,但有很多重復。例如,我得到 A、B、A、A、C、D,但我也得到 B、A、B、B、D、C,這在我的情況下是重復的。順序很重要,替換很重要,計數很重要,但性格并不重要。
查看完整描述

1 回答

?
躍然一笑

TA貢獻1826條經驗 獲得超6個贊

由于您只有 6 個類別,您可以使用 itertools.product 然后根據您的標準過濾您的結果。


您的示例有些令人困惑,因為我不確定您如何從不包含“D”的前三個類別“ABC”中獲得“AAABCD”,或者如何通過組合不包含“BCDEI”的“BCDEI”獲得“ABBBBC”包含“A”。但是,假設您想要獲得長度為 6 的“ABCDEF”的某個子集的所有唯一組合,直到符號替換,您可以這樣做。


from itertools import product


CATEGORIES = 'ABCDEF'


def combinations(cats):

    # use itertools to get all combinations 

    all_combs = product(cats,repeat=len(CATEGORIES))

    valid_combs = set()


    # For every possible combination find the order in which the characters appear

    for s in all_combs:

        s = ''.join(s)

        order = []

        for c in s:

            if c not in order: 

                order.append(c)


        # replace the character by ones following a set predetermined order

        for i,c in enumerate(order):

            replace_char = CATEGORIES[i].lower()

            s = s.replace(c, replace_char)


        # add to set to remove duplicates

        s = s.upper()

        valid_combs.add(s)

    return list(valid_combs)

用法


combinations('AB') 

['ABABBB', 'ABABBA', 'AABBBB', 'ABAABB', 'ABBAAA', 'AABAAA', 'AABABB', 'AAABAB', 'AABABA', 'AABAAB', 'ABAAAB', 'AABBAB', 'AAAAAB', 'ABBAAB', 'ABBABA', 'ABBABB', 'AAAABA', 'ABAAAA', 'AAABAA', 'ABAABA', 'ABBBAB', 'AAABBB', 'ABBBBA', 'AAABBA', 'AABBAA', 'ABABAA', 'AAAAAA', 'ABBBBB', 'ABABAB', 'ABBBAA', 'AABBBA', 'AAAABB']

這樣做的基本原理是,如果 'ABAACD' 和 'BABBDC' 屬于同一個等價類,則字符按順序出現的成員是該等價類的唯一代表。


雖然這不是很有效,因此對于更大的類別列表,您可能需要直接構建列表。


查看完整回答
反對 回復 2022-05-19
  • 1 回答
  • 0 關注
  • 99 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號