2016-07-26 19 views
1

dna配列のリストから始めれば、私はすべての可能なコンセンサス(各位置で最も高いヌクレオチド頻度を持つ 配列)のすべての配列を返さなければなりません。いくつかの位置でヌクレオチドが同じ最高頻度の を有する場合、私は最も高い頻度で全ての可能な組み合わせを得なければならない。 私はまた、プロファイル行列(各配列の各ヌクレオチドの頻度を持つ行列)を返さなければなりません。Python:複数のコンセンサス配列

これは、これまでの私のコードである(しかし、それは唯一のコンセンサス配列を返す):

seqList = ['TTCAAGCT','TGGCAACT','TTGGATCT','TAGCAACC','TTGGAACT','ATGCCATT','ATGGCACT'] 
n = len(seqList[0]) 
profile = { 'T':[0]*n,'G':[0]*n ,'C':[0]*n,'A':[0]*n } 

for seq in seqList: 

    for i, char in enumerate(seq): 
     profile[char][i] += 1 



consensus = "" 
for i in range(n): 
    max_count = 0 
    max_nt = 'x' 
    for nt in "ACGT": 
     if profile[nt][i] > max_count: 
      max_count = profile[nt][i] 
      max_nt = nt 
    consensus += max_nt 
print(consensus) 
for key, value in profile.items(): 
    print(key,':', " ".join([str(x) for x in value])) 

TTGCAACT 
C : 0 0 1 3 2 0 6 1 
A : 2 1 0 1 5 5 0 0 
G : 0 1 6 3 0 1 0 0 
T : 5 5 0 0 0 1 1 6 

(あなたが見ることができるように、位置4で、CとGが同じ最高のスコアを持っている、それは私がしなければならないことを意味します

すべての可能なシーケンスを得るためにこのコードを修正することは可能ですか、または正しい結果を得るためにロジック(擬似コード)を説明できますか?

ありがとうございます!

+0

現在、あなたのコードの印刷だけで、最後の配列ではなく、コンセンサス1 –

+0

が間違いのために申し訳ありません、オハッドをありがとう、私は私のコードを修正しました。今コンセンサスを返すべきです。 (ただし、1つだけですので、主な問題は残ります:)。答えについては、出力は2つのシーケンス全体を表示する必要があります。 – 3lli0t

+0

あなたのために固定 –

答えて

1

私はより良い方法があると確信しているが、これは簡単なものである:

bestseqs = [[]] 
for i in range(n): 
    d = {N:profile[N][i] for N in ['T','G','C','A']} 
    m = max(d.values()) 
    l = [N for N in ['T','G','C','A'] if d[N] == m] 
    bestseqs = [ s+[N] for N in l for s in bestseqs ] 

for s in bestseqs: 
    print(''.join(s)) 

# output: 
ATGGAACT 
ATGCAACT 
+0

@ 3lli0tあなたは大歓迎です。あなたは答えを受け入れるべきです。 –

+1

done;)もう一度ありがとう! – 3lli0t

関連する問題