6

给定一个替换映射{search: replace, search: replace, ...}和一个字符串,如何生成该字符串的所有可能替换的列表(第一个子字符串被替换,第二个子字符串被替换,都被替换等)。例子:

map = {
    'bee': 'BETA',
    'zee': 'ZETA',
    'dee': 'DELTA'
}

source_string = 'bee foo zee bar bee'

desired result = 
[
    'bee foo zee bar bee', 
    'BETA foo zee bar bee', 
    'bee foo ZETA bar bee', 
    'BETA foo ZETA bar bee', 
    'bee foo zee bar BETA', 
    'BETA foo zee bar BETA', 
    'bee foo ZETA bar BETA', 
    'BETA foo ZETA bar BETA'
]

顺序并不重要。

4

2 回答 2

4

'bee foo zee bar bee'=> ['bee', 'foo', 'zee', 'bar', 'bee']

from itertools import product

repl = {
    'bee': 'BETA',
    'zee': 'ZETA',
    'dee': 'DELTA'
}
source_string = 'bee foo zee bar bee'
p = product(*((x, repl[x]) if x in repl else (x,) for x in source_string.split()))
for x in p:
    print(x)

输出:

('bee', 'foo', 'zee', 'bar', 'bee')
('bee', 'foo', 'zee', 'bar', 'BETA')
('bee', 'foo', 'ZETA', 'bar', 'bee')
('bee', 'foo', 'ZETA', 'bar', 'BETA')
('BETA', 'foo', 'zee', 'bar', 'bee')
('BETA', 'foo', 'zee', 'bar', 'BETA')
('BETA', 'foo', 'ZETA', 'bar', 'bee')
('BETA', 'foo', 'ZETA', 'bar', 'BETA')
于 2013-05-09T14:32:38.370 回答
3

Itertools.product可以在这里帮助你。在您的示例中,您可以对字符串中的三个单词进行二元选择。所以

itertools.product((0, 1), repeat=3)

将为您提供 bee 和 zee 的 8 种可能替代品,其中0表示不替换,1表示分别替换为 BETA 和 ZETA。

以下做你想要的。

#!python3

import itertools

map = {
    'bee': 'BETA',
    'zee': 'ZETA',
    'dee': 'DELTA'
}

source_string = 'bee foo zee bar bee'

products = []
for word in source_string.split():
    if word in map:
        products.append((word, map[word]))
    else:
        products.append((word, ))

for words in itertools.product(*products):
    print(' '.join(words))
于 2013-05-09T14:32:58.593 回答