簡體   English   中英

如何獲取所有可能組合的列表?

[英]How to get a list of all possible combinations?

  • 目標:我有一個字符串通常看起來像這樣“010”,我需要以所有可能的方式將零替換為 1 [“010”,“110”,“111”,“011”]

  • 當我用 1 替換零時出現問題,我從左到右然后從右到左遍歷字符串的字母。 正如您在我所做的代碼中看到的那樣number = number[::-1] 現在,這種方法實際上並沒有涵蓋所有的可能性。

  • 我還需要可能從中間開始,或者可能使用排列方法但不確定如何在 python 中應用。

    • 從數學上講,有類似factorial of the number of places/(2)!
A = '0111011110000'
B = '010101'
C = '10000010000001101'
my_list = [A,B,C]
for number in [A,B,C]:
    number = number[::-1]
    for i , n in enumerate(number):
        number = list(number)
        number[i] = '1'
        number = ''.join(number)
        if number not in my_list: my_list.append(number)


for number in [A,B,C]:
    for i , n in enumerate(number):
        number = list(number)
        number[i] = '1'
        number = ''.join(number)
        if number not in my_list: my_list.append(number)
print(len(my_list))
print(my_list)

您可以使用單獨的零,然后使用itertools.product -

from itertools import product
x = '0011'
perm_elements = [('0', '1') if digit == '0' else ('1', ) for digit in x]
print([''.join(x) for x in product(*perm_elements)])
['0011', '0111', '1011', '1111']

好吧,您肯定會通過具有固定索引的組合的傳統實現獲得其他答案,但是由於我們只使用“0”和“1”,您可以使用下一個技巧:

source = "010100100001100011"
pattern = source.replace("0", "{}")
count = source.count("0")
combinations = [pattern.format(*f"{i:0{count}b}") for i in range(1 << count)]

基本上,我們計算源中零的數量,然后迭代范圍,其中限制是具有這個數量的設置位的數字,並將二進制形式的每個數字解壓縮成一個模式。

如果我們也為二進制轉換預定義模式,它應該會稍微快一點:

source = "010100100001100011"
pattern = source.replace("0", "{}")
count = source.count("0")
fmt = f"{{:0{count}b}}"
result = [pattern.format(*fmt.format(i)) for i in range(1 << count)]

我們也可以對這個問題使用遞歸解決方案,我們遍歷字符串,如果看到“0”將其更改為“1”,並在這個新字符串上開始另一個分支:

s = "010100100001100011"

def perm(s, i=0, result=[]):
    if i < len(s):
        if s[i] == "0":
            t = s[:i]+"1"+s[i+1:]
            result.append(t)
            perm(t, i+1, result)
        perm(s, i+1, result)

res = [s]
perm(s, 0, res)
print(res)

根據您的目標,您可以這樣做以獲得預期的結果。

A = '0111011110000'
B = '010'
C = '10000010000001101'
my_list = [A, B, C]
new_list = []
        
for key, number in enumerate(my_list):
    for key_item, num in enumerate(number):
        if it == "0":
            item_list = [i for i in number]
            item_list[key_item] = "1"
            new_list.append(''.join(item_list))
print(len(new_list))
print(new_list)

對於字符串中具有零的每個 position,您可以將其替換為 1 或不替換。 這將創建組合。 因此,您可以根據先前的替換結果,通過將每個“0”position 的替換添加到“1”來逐步構建字符串的結果列表:

def zeroTo1(S):
    result = [S]                 # start with no replacement
    for i,b in enumerate(S):
        if b != '0': continue                         # only for '0' positions
        result += [r[:i]+'1'+r[i+1:] for r in result] # add replacements
    return result

print(zeroTo1('010'))
['010', '110', '011', '111']

如果您被允許使用庫,則可以使用 itertools 的產品 function 直接為您組合零替換:

from itertools import product
def zeroTo1(S):
    return [*map("".join,product(*("01"[int(b):] for b in S)))]

乘積 function 生成的 1 和 0 元組通過將字符串連接 function 映射到其 Z78E6221F6393D1356681DB398F14CE6D 來組裝成單獨的字符串。

暫無
暫無

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

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