2013-05-09 27 views
6

Biorąc pod uwagę mapę zastępczą, taką jak {search: replace, search: replace, ...} i ciąg znaków, jak wygenerować listę wszystkich możliwych zamienników tego ciągu (pierwszy zastąpiony podłańcuch, drugi podłańcuch zastąpiony, oba wymienione itd.). Przykład:Generowanie wszystkich możliwych zamienników

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

Kolejność nie jest ważna.

Odpowiedz

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) 

wyjściowa:

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

Dzięki, tego właśnie szukałem. – georg

3

Itertools.product mogłyby pomóc tutaj. W twoim przykładzie masz wybór binarny dla trzech słów w twoim ciągu. Więc

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

daje swoje 8 możliwych zamienników dla pszczół i Zee, gdzie 0 środki nie zastępują i 1 środkiem wymiany z BETA i zeta odpowiednio.

Poniższe czynności wykonują to, co chcesz.

#!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

Świetnie, dzięki! .. – georg

Powiązane problemy