複数の可能な塩基を持つ一連の DNA 文字列のグロブのような拡張を作成しようとしています。
私の DNA 文字列のベースには、A、C、G、および T の文字が含まれています。ただし、A または C の M のような特殊文字を使用することはできます。
たとえば、次の文字列があるとします。
ATMM
この文字列を入力として取り、一致する可能性のある 4 つの文字列を出力したいと思います。
ATAA
ATAC
ATCA
ATCC
力ずくで解決するのではなく、これを行うにはエレガントな Python/Perl/Regular Expression のトリックが必要だと思います。
アドバイスありがとうございます。
編集、製品オペレーターのcortexに感謝します。これが私の解決策です:
まだ Python の初心者なので、別の for ループよりも各辞書キーを処理するためのより良い方法があるに違いありません。どんな提案も素晴らしいでしょう。
import sys
from itertools import product
baseDict = dict(M=['A','C'],R=['A','G'],W=['A','T'],S=['C','G'],
Y=['C','T'],K=['G','T'],V=['A','C','G'],
H=['A','C','T'],D=['A','G','T'],B=['C','G','T'])
def glob(str):
strings = [str]
## this loop visits very possible base in the dictionary
## probably a cleaner way to do it
for base in baseDict:
oldstrings = strings
strings = []
for string in oldstrings:
strings += map("".join,product(*[baseDict[base] if x == base
else [x] for x in string]))
return strings
for line in sys.stdin.readlines():
line = line.rstrip('\n')
permutations = glob(line)
for x in permutations:
print x