2014-09-16 1 views
1

나는 내 목표는 그와 같은 요소를 대체하여 초기 단어에서 가능한 모든 파생 상품의 목록을 작성하는 것입니다파이썬 : 그 문자를 대체하여 문자열의 모든 파생 상품을 만들

d = {'a' : ['1', '+', '='], 'b' : ['2'], c : ['3']} 

같은 몇 가지 DICT있어 :

word = 'abcde' 
rez = ['abcde', 
     '1bcde', '+bcde', '=bcde', 
     'a2cde', '12cde', '+2cde', '=2cde', 
     'ab3de', '1b3de', '+b3de', '=b3de', 'a23de', '123de', '+23de', '=23de'] 

rez의 단어 순서는 중요하지 않습니다.

itertools과 함께 쉬운 방법이 있어야한다고 생각합니다. 그러나 나는 그것을 볼 수 없습니다. 멋지고 아름다운 해결책은 대단히 환영 할 것입니다.

답변

5

확실하게, itertools은 이러한 종류의 문제에 대한 대답입니다. itertools.product을 사용하고 더 나은 대안하지만 내 마음에 오는 첫번째가있을 수 있습니다 :

from itertools import product 

[''.join(chars) for chars in product(*[[x] + d.get(x, []) for x in word])] 

출력

['abcde', 'ab3de', 'a2cde', 'a23de', '1bcde', '1b3de', '12cde', '123de', 
'+bcde', '+b3de', '+2cde', '+23de', '=bcde', '=b3de', '=2cde', '=23de'] 
+0

감사합니다 당신의 모든 사람들을위한 많은! 모든 솔루션은 나에게서 +1을 받았다. 그러나 이것도 또한 가장 빠르다 (그리고 가장 단순하다, 내 마음에). –

4

여기에 한 가지 방법입니다. 대체를 허용하지 않으려는 경우 (예 : "a"를 "a"로 남겨 둘 수 있음) 대체 문자 목록에 원래 문자를 포함 시켜서 사전에 예 : 'a': ['a', '1', '+', '=']이 포함되도록하는 것이 좋습니다. 그런 다음

for k in d: 
    d[k].append(k) 

:이 작업은 수행 할 수 있습니다

subs = [[(k, v) for v in vs] for k, vs in d.iteritems()] 
rez = [] 
for comb in itertools.product(*subs): 
    baseword = word 
    for before, after in comb: 
     baseword = baseword.replace(before, after) 
    rez.append(baseword) 

결과 : 그냥 재미를 위해

['123de', '1b3de', '12cde', '1bcde', '+23de', '+b3de', '+2cde', '+bcde', '=23de', '=b3de', '=2cde', '=bcde', 'a23de', 'ab3de', 'a2cde', 'abcde'] 
+0

은 OP에 지정된 결과를 제공하지 않습니다. – isedev

+0

@isedev : 예. 그렇습니다. 그들은 다른 순서에 있지만, 그는 중요하지 않다고 말한다. – BrenBarn

+0

죄송합니다. 질문에 대한 수정을 놓쳤습니다. – isedev

1

합니다. No import, no def, 들여 쓰기 없음.

d = {'a' : ['1', '+', '='], 'b' : ['2'], 'c' : ['3']} 
for key in d: d[key].append(key) 
print reduce(lambda items, f: sum(map(f, items), []), [lambda msg, c=c: [msg.replace(c, r) for r in d[c]] for c in d.keys()], ["abcde"]) 

결과 :

[ 
    '123de', '1b3de', '12cde', '1bcde', 
    '+23de', '+b3de', '+2cde', '+bcde', 
    '=23de', '=b3de', '=2cde', '=bcde', 
    'a23de', 'ab3de', 'a2cde', 'abcde' 
]