使用 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('?'))]
我一直在尝试使用 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('?'))]