首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rosalind共识与profile python

Rosalind共识与profile python
EN

Stack Overflow用户
提问于 2016-07-26 15:22:39
回答 1查看 2.9K关注 0票数 1

我正在研究罗莎琳德生物信息学网站(http://rosalind.info/problems/cons/)上的“共识和个人资料”问题。我使用网站上的示例输入尝试了我的代码,我的输出与示例输出相匹配。但是当我尝试更大的数据集时,网站说我的输出是错误的。有人能帮我找出我的问题所在吗?谢谢!

样本输入:

代码语言:javascript
复制
>Rosalind_1
ATCCAGCT
>Rosalind_2
GGGCAACT
>Rosalind_3
ATGGATCT
>Rosalind_4
AAGCAACC
>Rosalind_5
TTGGAACT
>Rosalind_6
ATGCCATT
>Rosalind_7
ATGGCACT

我提取了dna字符串并将它们存储在一个名为strings的列表中(在这个步骤中,我使用更大的数据集的尝试是正确的,因此我在这里省略了我的代码):

代码语言:javascript
复制
['ATCCAGCT', 'GGGCAACT', 'ATGGATCT', 'AAGCAACC', 'TTGGAACT', 'ATGCCATT', 'ATGGCACT']

我的代码之后:

代码语言:javascript
复制
#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]))

对于示例输入,M如下所示:

代码语言:javascript
复制
[['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']]

我的代码之后:

代码语言:javascript
复制
#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)

这些代码给出了正确的示例输出:

代码语言:javascript
复制
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

但是当我尝试更大的数据集时,网站说我的答案是wrong...Could,有人指出我错了吗?(我是初学者,谢谢你的耐心!)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-27 22:28:09

你的算法很好。正如@C_Z_所指出的,“确保您的格式与示例输出完全匹配”--不幸的是,情况并非如此。

代码语言:javascript
复制
print k + ":" + " ".join(str(x) for x in v)

应该是

代码语言:javascript
复制
print k + ": " + " ".join(str(x) for x in v)

在协商一致之后,而不是之前。如果您更改订单并添加空格,您的答案将被rosalind接受。

因为这是对您的问题的一个简单的回答,这里有一个解决相同问题的替代方案,而不是使用numpy:而不是对每个核苷酸使用变量,而是使用一个字典。用23种氨基酸做同样的事情并不有趣。

代码语言:javascript
复制
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,并为所有基存储所有计数。字典的关键是当前基。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38593923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档