Python 共识字符串&;轮廓矩阵

Python 共识字符串&;轮廓矩阵,python,rosalind,Python,Rosalind,我编写了以下python代码来解决Rosalind的一个问题(),出于某种原因,Rosalind说答案是错误的,但我做了一些抽查,结果似乎是正确的 问题如下: Given: A collection of at most 10 DNA strings of equal length (at most 1 kbp) in FASTA format. Return: A consensus string and profile matrix for the collection. (If seve

我编写了以下python代码来解决Rosalind的一个问题(),出于某种原因,Rosalind说答案是错误的,但我做了一些抽查,结果似乎是正确的

问题如下:

Given: A collection of at most 10 DNA strings of equal length (at most 1 kbp) in FASTA format.

Return: A consensus string and profile matrix for the collection. (If several possible consensus strings exist, then you may return any one of them.)
示例数据集是:

>Rosalind_1
ATCCAGCT
>Rosalind_2
GGGCAACT
>Rosalind_3
ATGGATCT
>Rosalind_4
AAGCAACC
>Rosalind_5
TTGGAACT
>Rosalind_6
ATGCCATT
>Rosalind_7
ATGGCACT
样品溶液为:

ATGCAACT
A: 5 1 0 0 5 5 0 0
C: 0 0 1 4 2 0 6 1
G: 1 1 6 3 0 1 0 0
T: 1 5 0 0 0 1 1 6
我试图解决这个问题:

from Bio import SeqIO

A,C,G,T = [],[],[],[]
consensus=""

for i in range(0,len(record.seq)):
    countA,countC,countG,countT=0,0,0,0
    for record in SeqIO.parse("fasta.txt", "fasta"):
        if record.seq[i]=="A":
            countA=countA+1
        if record.seq[i]=="C":
            countC=countC+1
        if record.seq[i]=="G":
            countG=countG+1
        if record.seq[i]=="T":
            countT=countT+1

    A.append(countA)
    C.append(countC)
    G.append(countG)
    T.append(countT)

    if countA >= max(countC,countG,countT):
        consensus=consensus+"A"
    elif countC >= max(countA,countG,countT):
        consensus=consensus+"C"
    elif countG >= max(countA,countC,countT):
        consensus=consensus+"G"
    elif countT >= max(countA,countC,countG):
        consensus=consensus+"T"

print("A: "+" ".join([str(i) for i in A]))
print("C: "+" ".join([str(i) for i in C]))
print("G: "+" ".join([str(i) for i in G]))
print("T: "+" ".join([str(i) for i in T]))

print(consensus)

如果有人能看一看并提出我做错了什么,那就太好了?非常感谢

对于一致性字符串,您的代码没有处理平局的情况,即给定位置的两个核苷酸的频率相等。按照现在编写代码的方式,这种情况将导致在本部分的一致性字符串中的该位置不打印任何内容

 if countA >= max(countC,countG,countT):
            consensus=consensus+"A"
        elif countC >= max(countA,countG,countT):
            consensus=consensus+"C"
        elif countG >= max(countA,countC,countT):
            consensus=consensus+"G"
        elif countT >= max(countA,countC,countG):
            consensus=consensus+"T"
改用此选项,您将正确获得共识序列

if countA[i] >= max(countC[i],countG[i],countT[i]):
      consensus+="A"
  if countC[i] >= max(countA[i],countG[i],countT[i]):
      consensus+="C"     
  if countG[i] >= max(countA[i],countC[i],countT[i]):
      consensus+="G"
  if countT[i] >= max(countA[i],countC[i],countG[i]):
      consensus+="T"

谢谢尼玛的建议。很好。我将count if语句编辑为>或相等,但恐怕这也不能解决问题。他们说:“如果存在多个可能的一致字符串,那么您可以返回其中的任何一个”,所以我认为这样迭代基是可以的。这仍然是错误的。如果您在当前代码中简单地将>更改为>=,那么您将输出在该位置最频繁的所有核苷酸。您应该只输出在该位置最常见的核苷酸中的1个,这只是为了给您一个正确方向的提示:Python的
continue
关键字可以在建议Niema的>to>=updateAnks之后使您的代码正确。我不确定你的意思,因为我有一个“elif”语句,如果前面的语句是真的,它就不应该执行。例如:x=4 y=3如果xUpdate,代码按原样运行,并在Rosalind中给了我正确的答案:)我不确定您所说的“继续”是什么意思