生成所有可能的替换

时间:2013-05-09 13:53:28

标签: python combinatorics

给定替换映射,如{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'
]

订单并不重要。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

Itertools.product可以帮到你。在您的示例中,您可以在字符串中选择三个单词。所以

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

将为您提供8种可能的蜜蜂和zee替代品,其中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))