2013-05-09 7 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

3

Itertools.product तुम यहाँ मदद कर सकता है। आपके उदाहरण में आपके स्ट्रिंग में तीन शब्दों के लिए बाइनरी विकल्प है। तो

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

मधुमक्खी और ज़ी, जहां 0 साधन की जगह नहीं है और 1 साधन क्रमशः बीटा और जीटा के साथ बदलें के लिए आप अपने 8 संभव प्रतिस्थापन दे देंगे।

निम्नलिखित जो आप चाहते हैं वह करता है।

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

संबंधित मुद्दे