使用Python替换多个字符的字符

Guy*_*Tal 2 python string generator str-replace

我一直在尝试使用Python解决以下问题,到目前为止没有成功:

假设你有一个字符串'0','1'和'?'.'?' 符号可以是'0'或'1'.您的目标是打印此类给定字符串的所有可能输出.例如,字符串'0?1?'的输出 应该是'0010','0011','0110'和'0111'

我尝试过以下方法:

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
Run Code Online (Sandbox Code Playgroud)

结果很奇怪,而不是我想要得到的:

<generator object comb at 0x106b2ceb0>
<generator object comb at 0x106b2cf00>
Run Code Online (Sandbox Code Playgroud)

知道为什么它不工作,以及我应该如何更改代码才能工作?

Ana*_*mar 7

comb() 你做的是一个发电机功能 -

yield comb(S.replace('?','0',1))
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

示例/演示 -

>>> 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
Run Code Online (Sandbox Code Playgroud)

[编辑]:请注意,从Python 3.3开始,您可以使用语法中的新yield:

yield from comb(S.replace('?','0',1))
yield from comb(S.replace('?','1',1))
Run Code Online (Sandbox Code Playgroud)