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

时间:2015-07-30 03:56:38

标签: python string generator str-replace

我一直在尝试使用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

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

4 个答案:

答案 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('?'))]