2013-05-09 21 views
6

{search: replace, search: replace, ...} gibi bir yedek harita ve bir dize verildiğinde, bu dizenin tüm olası değiştirilişlerinin bir listesi nasıl oluşturulur (ilk alt dizgi değiştirildi, ikinci alt dizgi değiştirildi, ikisi de değiştirildi vb.). Örnek:Olası tüm yedekleri üret

Sipariş önemli değil. =>['bee', 'foo', 'zee', 'bar', 'bee']

cevap

3

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

Çıktı:

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

Teşekkürler, aradığım şey buydu. – georg

3

Itertools.product burada yardımcı olabilir. Örneğinizde dizinizde üç kelime için ikili seçim var. Yani

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

0 araç yerine geçmez ve 1 araçlar sırasıyla BETA ve ZETA ile değiştirin arı ve zee için size 8 olası değiştirmeler verecektir.

Aşağıdakiler istediğiniz şeyi yapar.

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

Harika, teşekkürler! .. – georg

İlgili konular