美文网首页零基础学PhytonStackOverFlow精彩问答生活不易 我用python
用多个字符替换一个字符,并得到所有可能的组合结果

用多个字符替换一个字符,并得到所有可能的组合结果

作者: StackOverFlow精选 | 来源:发表于2015-07-30 13:48 被阅读331次

    问:

    假设有一个带有'?','0','1'字符的字符串(其中'?'为'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

    但输出是:

    <generator object comb at 0x106b2ceb0>

    <generator object comb at 0x106b2cf00>

    我的解法哪里有问题呢?

    答1:

    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

    答2:

    可以使用非递归的方式,使用itertools中的方法实现

    代码如下:

    import itertools

        def allstrings(s):

        consts = s.split('?')

        constsize = len(consts)

        varsize = len(consts) - 1

        allstrs = (varsize + constsize) * [None]

        allstrs[::2] = ((x,) for x in consts)

        allstrs[1::2] = varsize * ['01']

        return list(''.join(x) for x in itertools.product(*allstrs))

    print(allstrings('0?1?'))

    【注】第二种解法涉及到itertools.product()方法

    官方文档对方法的描述: https://docs.python.org/2/library/itertools.html#itertools.product

    product()方法相当于for循环的嵌套使用

    比如

    product(A,B)  相当于  ((x,y) for x in A for y in B)

    product(range(2),repeat=3)  相当于  ((x,y,z) for x in range(2) for y in range(2) for z in range(2))

    答3:

    问题中方法得到的生成器,只需再对其进行遍历也能得到结果,第三个答案的解法就是这个思路

    def comb(S):

        if not '?' in S:

            print(S)

             yield S

            return

        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)

    原址:http://stackoverflow.com/questions/31714940/replace-a-character-with-multiple-characters-using-python

    欢迎到@StackOverFlow精选 提问,建议,唠嗑。

    相关文章

      网友评论

        本文标题:用多个字符替换一个字符,并得到所有可能的组合结果

        本文链接:https://www.haomeiwen.com/subject/nlamqttx.html