3

たとえば、DNA ストリングを考えてみAGCます。指定された文字列で最大 #n (ユーザー定義番号) の不一致を許可する、すべての可能な一意の文字列を生成しようとしています。

次の方法で 1 つの不一致に対してこれを行うことができますが、再帰的なソリューションを実装して、#n 不一致、DNA 文字列、および突然変異セット (AGCTN) に基づいて可能なすべての組み合わせを生成することはできません。

temp_dict = {}
sequence = 'AGC'

    for x in xrange(len(sequence)):
        prefix = sequence[:x]
        suffix = sequence[x+1:]
        temp_dict.update([ (prefix+base+suffix,1) for base in 'ACGTN'])
    print temp_dict

例:

特定のサンプル文字列 : ACGの場合、以下は 13 個の一意のシーケンスであり、最大 1 つの不一致が許容されます

{'ACC': 1, 'ATG': 1, 'AAG': 1, 'ANG': 1, 'ACG': 1, 'GCG': 1, 'AGG': 1, 
'ACA': 1, 'ACN': 1, 'ACT': 1, 'TCG': 1, 'CCG': 1, 'NCG': 1}

これを一般化して、プログラムが 100 文字の長さの DNA 文字列を取得し、ユーザー定義の #mismatches を許可する一意の文字列のリスト/dict を返すことができるようにします。

ありがとう!-アビ

4

2 に答える 2

6

itertools私があなたを理解していると仮定すると、モジュールを使用できると思います。基本的な考え方は、 を使用して不一致が発生する場所を選択し、 を使用しcombinationsて満足のいくすべてのリストを作成することproductです。

import itertools

def mismatch(word, letters, num_mismatches):
    for locs in itertools.combinations(range(len(word)), num_mismatches):
        this_word = [[char] for char in word]
        for loc in locs:
            orig_char = word[loc]
            this_word[loc] = [l for l in letters if l != orig_char]
        for poss in itertools.product(*this_word):
            yield ''.join(poss)

あなたの例の場合:

>>> mismatch("ACG", "ACGTN", 0)
<generator object mismatch at 0x1004bfaa0>
>>> list(mismatch("ACG", "ACGTN", 0))
['ACG']
>>> list(mismatch("ACG", "ACGTN", 1))
['CCG', 'GCG', 'TCG', 'NCG', 'AAG', 'AGG', 'ATG', 'ANG', 'ACA', 'ACC', 'ACT', 'ACN']
于 2012-07-27T00:33:52.933 に答える
3

受け入れられた答えは、 Nまでではなく、 N 個の不一致のみを与えると思います。受け入れられた回答をわずかに変更すると、これが修正されるはずです。

from itertools import combinations,product

def mismatch(word, i = 2):
  for d in range(i+1):
    for locs in combinations(range(len(word)), d):
      thisWord = [[char] for char in word]
      for loc in locs:
        origChar = word[loc]
        thisWord[loc] = [l for l in "ACGT" if l != origChar]
      for poss in product(*thisWord):
        yield "".join(poss)    

kMerList = list(mismatch("AAAA",3))

print kMerList

プログラミング初心者のため、間違っていたらご指摘ください。

于 2013-11-10T14:36:01.593 に答える