给定一个模式,我们需要通过0 and 1
填充模式中缺少的位置来生成所有可能的二进制数。
E.g。
Pattern = "x1x";
输出:
010
110
011
111
答案 0 :(得分:5)
这是相对简单的递归,不需要使用库:
def process(patt):
if "x" not in patt:
print(patt)
else:
process(patt.replace("x", "0", 1))
process(patt.replace("x", "1", 1))
process("x1x")
<强>输出强>
010
011
110
111
答案 1 :(得分:0)
尝试这种方式:
def pattern(str1, idx):
str = list(str1)
if idx == len(str):
print(''.join(str))
return 0
if str[idx] == 'x':
# replace 'x' by '0' and recurse
str[idx] = '0'
pattern(str, idx + 1)
# replace 'x' by '1' and recurse
str[idx] = '1'
pattern(str, idx + 1)
# No need to backtrack as string is passed by value to the function
else:
pattern(str, idx + 1)
str = "x1x"
pattern(str, 0)
输出:
010
011
110
111
答案 2 :(得分:0)
我认为您可以使用itertools.product([0, 1], repeat=2)
,然后过滤输出以满足您的需求:
>>> import itertools
>>>
>>> [''.join(x) for x in itertools.product(['0', '1'], repeat=3) if x[1] == '1']
['010', '011', '110', '111']
答案 3 :(得分:0)
这是使用itertools
解决问题的一种可能方法:
import itertools
pattern = "x1x"
a = [['0','1'] if (c == 'x') else c for c in pattern]
b = [''.join(lst) for lst in list(itertools.product(*a))]
for s in b:
print(s)
输出:
010
110
011
111
答案 4 :(得分:0)
这是另一个使用python正则表达式模块 re
和 itertool
,如其他答案所示。
import re
import itertools
pattern = 'x1x'
patt = re.compile(pattern.replace('x', '.'))
pattern_length = len(pattern)
perms = [ '1','0'] *pattern_length
ls = list()
for x in itertools.permutations(perms, pattern_length):
ls.append(x)
func = lambda x: ''.join(x)
keep = list()
for x in ls:
x_ = func(x)
if patt.match(x_) and not x_ in keep:
keep.append(x_)
for k in keep:
print k
输出中:
110
111
011
010
答案 5 :(得分:0)
这是使用列表(队列)的另一种方法。它弹出列表中的第一个条目,并在输入字符串中找到第一个出现的“ x”,然后将其替换为“ 0”,然后替换为“ 1”,然后将这两个新字符串附加到列表中。直到列表中没有“ x”为止。我相信这是使用简单的while
循环的最简单方法之一:
def pattern_processor(list):
while "x" in list[0]:
item=list.pop(0)
list.append(item.replace("x", "0", 1))
list.append(item.replace("x", "1", 1))
return(list)
驱动程序代码:
if __name__ == "__main__":
print(pattern_processor(["11x1x"]))
输出:
['11010', '11011', '11110', '11111']