使用 Python 将一个字符替换为多个字符

Replace a character with multiple characters using Python

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

假设您有一个包含字符“0”、“1”和“?”的字符串。这 '?'符号可以是“0”或“1”。您的目标是打印给定 string.For 示例的所有可能输出,字符串 '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

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

<generator object comb at 0x106b2ceb0>
<generator object comb at 0x106b2cf00>

知道为什么它不起作用吗?我应该如何更改代码才能使其起作用?

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

Example/Demo -

>>> 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))

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?'))

你所做的也很完美,但这里的问题是你得到了一个生成器的生成器..你已经迭代了这些生成器以获得值..

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)

我知道这个 post 已经有 2 年历史了,但是这个解决方案可能会帮助其他人将来检查这个 post: 使用 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('?'))]