我一直在尝试使用Python解决以下问题,但到目前为止还没有成功:
假设您有一个字符串为'0','1'和'?'的字符串。 '?'符号可以是'0'或'1'。您的目标是打印此类给定字符串的所有可能输出。例如,字符串'0?1?'的输出应该是'0010','0011','0110'和'0111'
我尝试了以下内容:
mainInfo.$promise
结果很奇怪,而不是我想要的:
def comb(S):
if not '?' in S:
yield S
else:
yield comb(S.replace('?','0',1))
yield comb(S.replace('?','1',1))
S = '0?1??011'
S_generator = comb(S)
for s in S_generator:
print s
知道为什么它不起作用,以及我应该如何更改代码才能工作?
答案 0 :(得分:7)
comb()
是一个生成器函数 -
yield comb(S.replace('?','0',1))
yield
语句不会自动遍历生成器中的所有值并生成它们,您必须循环遍历这些值并逐个生成它们,例如 -
def comb(S):
if not '?' in S:
yield S
else:
for i in comb(S.replace('?','0',1)):
yield i
for i in comb(S.replace('?','1',1)):
yield i
示例/演示 -
>>> def comb(S):
... if not '?' in S:
... yield S
... else:
... for i in comb(S.replace('?','0',1)):
... yield i
... for i in comb(S.replace('?','1',1)):
... yield i
...
>>> for s in comb('abc?def?'):
... print(s)
...
abc0def0
abc0def1
abc1def0
abc1def1
>>> for s in comb('0?1?'):
... print(s)
...
0010
0011
0110
0111
>>> S = '0?1??011'
>>> for s in comb(S):
... print(s)
...
00100011
00101011
00110011
00111011
01100011
01101011
01110011
01111011
[编辑] :请注意,从Python 3.3开始,您可以使用新的yield from语法:
yield from comb(S.replace('?','0',1))
yield from comb(S.replace('?','1',1))
答案 1 :(得分:2)
Anand的回答是正确的,并显示您的功能正在发生什么。
您还可以使用itertools产品函数非递归地执行此任务。例如:
import itertools
def allstrings(s):
consts = s.split('?')
allstrs = (2 * len(consts) - 1) * ['01']
allstrs[::2] = ((x,) for x in consts)
# Optimize out empty constants
allstrs = (x for x in allstrs if x[0])
return list(''.join(x) for x in itertools.product(*allstrs))
print(allstrings('0?1?'))
答案 2 :(得分:1)
你所做的也很完美,但这里的问题是你得到了一个生成器的生成器..你已经迭代了那些以获得值..
def comb(S):
if not '?' in S:
yield S
else:
yield comb(S.replace('?','0',1))
yield comb(S.replace('?','1',1))
S = '0?1??011'
S_generator = comb(S)
def print_generator_values(parent_generator):
import types
for i in parent_generator:
if isinstance(i, types.GeneratorType):
print_generator_values(i)
print_generator_values(S_generator)
答案 3 :(得分:0)
我知道此帖子已有2年历史,但此解决方案可能有助于其他人在将来查看此帖子: 使用python 3.6(但也适用于以前的版本)和格式:
from itertools import product
def replace_values(string):
pattern_format = string.replace('?', '{}')
return [pattern_format.format(*values) for values in product('10', repeat=string.count('?'))]