0

我是 python 新手,希望能得到一些帮助。

我有这个脚本,它对序列中的每三个碱基进行计数,直到它识别出一个终止密码子,然后中断并返回该值。这适用于每个阅读框 0、+1、+2。

我希望它在识别终止密码子之前脚本运行到序列末尾时返回值 0。目前,脚本为 count0 返回 18,这应该是 0,因为序列在找到“TAG”或“TAA”之前结束

任何帮助将不胜感激!

seq="TCATTCTaTTTAAAAAAatATAAAaGGGgTTTTGGGgTTTtGGGGTTTtGGGG"

stop_codons = ["TAG", "TAA"]
count0 = 0
n = 0
while n < len(seq):
    if seq[n:n+3] in stop_codons:
        break
    count0 += 1
    n += 3
print count0      

count1 = 0
n = 1
while n < len(seq):
    if seq[n:n+3] in stop_codons:
        break
    count1 += 1
    n += 3
print count1      

count2 = 0
n = 2
while n < len(seq):
    if seq[n:n+3] in stop_codons:
        break
    count2 += 1
    n += 3
print count2 

结果:

18
3
6
4

6 回答 6

2

一个简单的解决方法是做这样的事情。不过,您应该考虑重构您的代码。

stop_codons = ["TAG", "TAA"]
count0 = 0
n = 0
found = False
while n < len(seq):
    if seq[n:n+3] in stop_codons:
        found = True
        break
    count0 += 1
    n += 3

if not found:
    count0 = 0
于 2013-09-04T09:18:16.270 回答
2

我建议将迭代代码推送到一个函数中:

def get_codon_index(seq, start_idx):
    count = 0
    n = start_idx
    while n < len(seq):
        if seq[n:n+3] in stop_codons:
            return count
        count += 1
        n += 3
    return -1

这样可以节省引入布尔标志的工作并避免代码重复。

我返回-1而不是0,因为0可能是密码子的实际索引(如果密码子位于序列的开头)。

于 2013-09-04T09:26:11.410 回答
0

您搜索终止密码子,如果找到它,它会过早退出循环。但除此之外,它运行完整的循环,退出循环n == len(seq),然后仍然打印计数。

两种解决方案:

仅在找到终止密码子时打印:

count1 = 0
n = 1
while n < len(seq):
    if seq[n:n+3] in stop_codons:
        print count1
        break
    count1 += 1
    n += 3

或设置一个stopped标志:

count1 = 0
n = 1
stopped = False
while n < len(seq):
    if seq[n:n+3] in stop_codons:
        stopped = True
        break
    count1 += 1
    n += 3
if stopped:
    print count1   
于 2013-09-04T09:20:44.267 回答
0
seq="TCATTCTaTTTAAAAAAatATAAAaGGGgTTTTGGGgTTTtGGGGTTTtGGGG"
stop_codons = ["TAG", "TAA"]

def printcount(seq, stop_codons, start):
    found = False
    count = 0
    n = start
    while n < len(seq):
        if seq[n:n+3] in stop_codons:
            found = True
            break        
        count += 1
        n += 3
    print count if found else 0

printcount(seq, stop_codons, 0)
printcount(seq, stop_codons, 1)
printcount(seq, stop_codons, 2)
于 2013-09-04T09:24:46.527 回答
0

此代码将遍历您的序列并在找到返回终止密码子第一个字符位置的 TAA 或 TAG 序列时停止

seq="TCATTCTaTTTAAAAAAatATAAAaGGGgTTTTGGGgTTTtGGGGTTTtGGGG"

list = ["z", "z", "z"] # otherwise the list will not be of 3 characters
i = 0

for letter in seq:
    list.pop(0)
    list.append(letter)
    codon = "".join(list)
    i = i + 1
    if codon == "TAG" or codon == "TAA":
        print i - 2 # to print the position of T
        break
于 2013-09-04T09:27:53.433 回答
0

帮自己一个忙,不要重新发明轮子,尤其是当BioPython可以免费获得并被广泛使用时。

于 2013-09-04T11:26:17.037 回答