簡體   English   中英

組合沒有Python中所有元素的重復

[英]Combinations without duplicates of all elements in Python

為了澄清圖片,如果我有一個字符串:

'pac'

在這個例子中,我想獲得它的每個排列的列表:

['p', 'a', 'c', 'pa', 'pc', 'pac']

就像我會在某些搜索引擎中輸入任何一個類似Ebay上的那個,它會彈出“pac”作為建議。

代碼吼叫是我迄今為止所取得的成就,但它顯然不能正常工作。 'Names'只是一個包含多個名稱的列表,例如:['pac','greg','witch']

    letters = {}
    for name in names:
        temp = []
        letter = []
        temp2 = []

        for let in name:
            let = let.lower()
            temp.append(let)
            letter.append(let)

        for i in range(0, len(name)):
            for j in range(1, len(name) - i):
                print(i, j, end='  ')

                to_add = letter[i] + temp[j]
                print(to_add, temp2)

                temp2.append(to_add)
                letter.append(to_add)
            temp = temp2
            temp2 = []

        letters[name] = letter
    return letters

如果有內置函數隨時與我分享,但這不是問題的核心。

用戶標准庫itertools

In [48]: T = 'pac'

In [49]: list(itertools.chain(*[itertools.combinations(T, i+1) for i in range(len(T))]))
Out[49]: [('p',), ('a',), ('c',), ('p', 'a'), ('p', 'c'), ('a', 'c'), ('p', 'a', 'c')]

它分解為:

1, itertools.combinations(['p', 'a', 'c'], i)生成樣本大小為i的'pac'的所有子樣本

2,對i=1, 2, 3重復i ,並將得到的三個itertools.combination對象放在一個列表中

3,從#2解壓縮列表,並使用它們作為參數生成一個itertools.chain對象(顧名思義,它將鏈接其args)。 查看有關參數unpack的更多信息

在很多現實世界的用例中,特別是當元素的總數很大時,你實際上並不想從itertools.chain對象中創建一個列表。 使用itertools目的通常是通過避免將所有成員放在內存中來實現內存效率。

(如果你不想要tuple只需添加一個''.join來讓它們回到字符串)

暫無
暫無

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

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