2016-04-30 22 views
2

私は、与えられた入力文字列の一意の文字を、辞書の対応する値で置き換えて、「非」一意の文字の位置を保持しながら組み合わせています。文字列のすべての可能な組み合わせを生成するが、A」の位置を維持しながら、「R」と「Y」のすべてのインスタンスを置き換えるに行くかどうマルチダイクを使った並べ替え

d = {'R':['A','G'], 'Y':['C','T']} 

例えば、私は次の辞書を持っています'と' C '?

'AACC' 
'AGCC' 
'AACT' 
'AGCT' 

うまくいけば、意味があります:

は例えば、入力「ダーシーは」次の出力を生成します。誰かが正しい方向に私を指すことができる場合は、それは素晴らしいだろう!複数のリストに

+2

文字を置き換えるためには 'str.replace'を、順列には' 'itertools.permutations'(https://docs.python.org/3.5/library/itertools.html#itertools.permutations)を使用してください。 – ChrisP

+0

ユニークなことは、入力に一度RとYしか表示されないということですか? – ayhan

+0

RやYのような文字は複数の値に置き換えられ、それ以外の文字はそのままであるという意味でユニークです。 – moj

答えて

1

generator functionは、enumeratezipitertools.productを使用して、ご希望の文字列のすべてを生成list comprehensionargument list unpackingこれらはすべて非常に便利ですPythonツール/コンセプト:

from itertools import product 

def multi_replace(s, d): 
    indexes, replacements = zip(*[(i, d[c]) for i, c in enumerate(s) if c in d]) 
    # indexes: (1, 3) 
    # replacements: (['A', 'G'], ['C', 'T']) 

    l = list(s) # turn s into sth. mutable 
    # iterate over cartesian product of all replacement tuples ... 
    for p in product(*replacements): 
     for index, replacement in zip(indexes, p): 
      l[index] = replacement 
     yield ''.join(l) 

d = {'R': ['A', 'G'], 'Y': ['C', 'T']} 
s = 'ARCY' 

for perm in multi_replace(s, d): 
    print perm 

AACC 
AACT 
AGCC 
AGCT 

s = 'RRY' 

AAC 
AAT 
AGC 
AGT 
GAC 
GAT 
GGC 
GGT 
+0

恐ろしい!これは素晴らしい作品です、ありがとうございます。 – moj

0

変更ARCYとコードの下に使用します。

import itertools as it 
list = [['A'], ['A','G'],['C'],['C','T']] 
[''.join(item) for item in it.product(*list)] 

または

import itertools as it 
list = ['A', 'AG','C', 'CT'] 
[''.join(item) for item in it.product(*list)] 
+0

ディクショナリから値を取得する方法はありますか?入力を15文字に拡張すると、この方法は非常に面倒になります。 – moj

+0

空リストを取得し、入力文字列から各文字を繰り返し、キー(各文字)が辞書に存在するかどうかをチェックし、一致するものがあれば最初のリストに値を追加し、一致するものが見つからなければ最初のリストに[現在の文字]を追加します。入力文字列の長さが長い場合でも面倒ではありません。 –

関連する問題