2016-07-26 27 views
1

我正在Rosalind生物信息學網站(http://rosalind.info/problems/cons/)上處理「Consensus nd Profile」問題。我使用網站上的示例輸入嘗試了我的代碼,輸出與示例輸出相匹配。但是當我嘗試更大的數據集時,網站表示我的輸出是錯誤的。有人能幫我確定我的問題在哪裏嗎?謝謝!Rosalind共識和個人檔案python

樣品輸入:

>Rosalind_1 
ATCCAGCT 
>Rosalind_2 
GGGCAACT 
>Rosalind_3 
ATGGATCT 
>Rosalind_4 
AAGCAACC 
>Rosalind_5 
TTGGAACT 
>Rosalind_6 
ATGCCATT 
>Rosalind_7 
ATGGCACT 

我已經提取的DNA串,並將它們存儲在列表稱爲字符串(我用更大的數據集試驗是在這一步正確的,所以我在這裏上遺漏了我的代碼):

['ATCCAGCT', 'GGGCAACT', 'ATGGATCT', 'AAGCAACC', 'TTGGAACT', 'ATGCCATT', 'ATGGCACT'] 

我的代碼算賬:

#convert strings into matrix 
matrix = [] 
for i in strings: 
    matrix.append([j for j in i]) 
M = np.array(matrix).reshape(len(matrix),len(matrix[0])) 

中號看起來像這樣的樣本輸入:

[['A' 'T' 'C' 'C' 'A' 'G' 'C' 'T'] 
['G' 'G' 'G' 'C' 'A' 'A' 'C' 'T'] 
['A' 'T' 'G' 'G' 'A' 'T' 'C' 'T'] 
['A' 'A' 'G' 'C' 'A' 'A' 'C' 'C'] 
['T' 'T' 'G' 'G' 'A' 'A' 'C' 'T'] 
['A' 'T' 'G' 'C' 'C' 'A' 'T' 'T'] 
['A' 'T' 'G' 'G' 'C' 'A' 'C' 'T']] 

我算賬代碼:

#convert string matrix into profile matrix 
A = [] 
C = [] 
G = [] 
T = [] 
for i in range(len(matrix[0])): 
    A_count = 0 
    C_count = 0 
    G_count = 0 
    T_count = 0 
    for j in M[:,i]: 
     if j == "A": 
      A_count += 1 
     elif j == "C": 
      C_count += 1 
     elif j == "G": 
      G_count += 1 
     elif j == "T": 
      T_count += 1 
    A.append(A_count) 
    C.append(C_count) 
    G.append(G_count) 
    T.append(T_count) 

profile_matrix = {"A": A, "C": C, "G": G, "T": T} 
for k, v in profile_matrix.items(): 
    print k + ":" + " ".join(str(x) for x in v) 

#get consensus string 
P = [] 
P.append(A) 
P.append(C) 
P.append(G) 
P.append(T) 
profile = np.array(P).reshape(4, len(A)) 
consensus = [] 
for i in range(len(A)): 
    if max(profile[:,i]) == profile[0,i]: 
     consensus.append("A") 
    elif max(profile[:,i]) == profile[1,i]: 
     consensus.append("C") 
    elif max(profile[:,i]) == profile[2,i]: 
     consensus.append("G") 
    elif max(profile[:,i]) == profile[3,i]: 
     consensus.append("T") 
print "".join(consensus) 

這些代碼給出正確的輸出樣本:

A:5 1 0 0 5 5 0 0 
C:0 0 1 4 2 0 6 1 
T:1 5 0 0 0 1 1 6 
G:1 1 6 3 0 1 0 0 
ATGCAACT 

但當我更大的數據集的網站說,我的答案是錯的...有人能指出我錯在哪裏嗎? (我是初學者,感謝您的耐心!)

+0

確保您的格式與樣本輸出完全匹配。這意味着在每行的冒號後加一個空格,將共有字符串放在頂部,並按照「ACGT」的順序排列核苷酸。 –

+0

你見過這個嗎? http://stackoverflow.com/questions/38586800/python-multiple-consensus-sequences/ –

+0

@C_Z_哦,我沒有注意到之前...謝謝你的提示! – largecats

回答

1

您的算法是完全正確的。正如@C_Z_指出的那樣,「確保你的格式與樣本輸出完全匹配」,但不幸的是並非如此。

print k + ":" + " ".join(str(x) for x in v) 

應該

print k + ": " + " ".join(str(x) for x in v) 

跟從,而不是之前,共有序列。 如果您更改訂單並添加空間,您的答案將被rosalind接受。


由於這是一個簡單的回答你的問題,這裏是同樣的問題,而無需使用numpy的一種替代方案: 而不是使用變量對每個核苷酸,使用字典。用23個氨基酸做同樣的事情是沒有趣的,例如,

from collections import defaultdict 
for i in range(len(strings[0])): 
    counter.append(defaultdict(int)) 
    for seq in seqs: 
     counter[i][seq[i]] += 1 
    consensus += max(counter[i], key=counter[i].get) 

counter店與所有所有計數基地每個位置dictionary。字典的關鍵是當前的基礎。

+0

非常感謝您的答案(和代碼)!我嘗試了匹配我的格式,但rosalind仍然說這是錯誤的...我想知道是否可能是我的輸出以某種方式包含\ n,結果,而不是直到行尾(即最大字符數Rosalind允許在一行中),我的輸出變成塊。 。你怎麼看?謝謝! – largecats

+0

詞典是未排序的,所以如果你迭代它,鍵的順序是隨機的。你可以嘗試:'for'in'ACGT':print k +「:」+「」.join(str(x)for profile_matrix [n])'從而強制執行正確的順序。 –