2013-05-09 81 views
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' 
] 

訂單並不重要。

回答

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

謝謝,這就是我一直在尋找的東西。 – georg 2013-05-09 14:40:38

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)) 
+0

太好了,謝謝! – georg 2013-05-09 14:40:08