6

置換マップ like{search: replace, search: replace, ...}と文字列が与えられた場合、その文字列のすべての可能な置換のリストを生成する方法 (最初の部分文字列の置換、2 番目の部分文字列の置換、両方の置換など)。例:

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

順序は重要ではありません。

4

2 に答える 2

4

'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')
于 2013-05-09T14:32:38.370 に答える
3

Itertools.productここであなたを助けることができます。あなたの例では、文字列内の 3 つの単語に対してバイナリ選択があります。そう

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

bee と zee の 8 つの可能な置換を示します。ここで、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))
于 2013-05-09T14:32:58.593 に答える