目標:我有一個字串通常看起來像這樣“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)
uj5u.com熱心網友回復:
您可以使用單獨的零,然后使用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']
如果您只需要此類組合的數量,而不是串列本身 - 那應該只是 2 ** x.count('0')
uj5u.com熱心網友回復:
好吧,您肯定會通過具有固定索引的組合的傳統實作獲得其他答案,但是由于我們只使用“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)]
更新。目前尚不清楚您需要生成所有可能的組合還是只獲取數字,所以最初我提供了生成它們的代碼,但是如果您仔細查看我的方法,我將使用 獲取所有可能組合的數量1 << count,其中count是'0'字符的數量在源字串中。因此,如果您只需要數字,則代碼如下:
source = "010100100001100011"
number_of_combinations = 1 << source.count("0")
或者,您也可以使用2 ** source.count("0"),但通常功率比二進制移位慢得多,所以我建議使用我最初建議的選項。
uj5u.com熱心網友回復:
我們也可以對這個問題使用遞回解決方案,我們遍歷字串,如果看到“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)
uj5u.com熱心網友回復:
對于字串中具有零的每個位置,您可以將其替換為 1 或不替換。這將創建組合。因此,您可以通過根據先前的替換結果將每個“0”位置的替換添加到“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 中的產品功能可用于直接為您組合零替換:
from itertools import product
def zeroTo1(S):
return [*map("".join,product(*("01"[int(b):] for b in S)))]
通過將字串連接函式映射到其輸出,將乘積函式生成的 1 和 0 元組組裝成單獨的字串。
uj5u.com熱心網友回復:
根據您的目標,您可以這樣做以獲得預期的結果。
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):
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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/406025.html
標籤:
上一篇:我被質數計算器困住了
下一篇:根據負面和正面計算聲譽百分比
