【问题标题】:Counting the distance between values with python用python计算值之间的距离
【发布时间】:2013-09-04 09:04:32
【问题描述】:

我是 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

【问题讨论】:

  • 在您的示例中,它找到了 TAA(我也可以看到),所以它打印 18。但是您说它应该是 0,因为序列在找到“TAG”或“TAA”之前结束"'
  • 请写一个以n为参数的函数。您将避免大量代码重复和错误!
  • @doctorlove TAA 在 +1 帧中。即从 CATTCT 开始...在第 0 帧 TCATTCT 中没有停止...

标签: python bioinformatics


【解决方案1】:

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

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

【讨论】:

    【解决方案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 可能是密码子的实际索引(如果密码子位于序列的开头)。

    【讨论】:

    • 感谢约翰内斯的帮助
    【解决方案3】:
    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)
    

    【讨论】:

    【解决方案4】:

    您搜索终止密码子,如果找到,它会提前退出循环。 但除此之外,它会运行完整的循环,在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   
    

    【讨论】:

      【解决方案5】:

      此代码将遍历您的序列并在找到返回终止密码子第一个字符位置的 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
      

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-11-29
          • 2021-11-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-07
          • 2014-02-28
          • 2010-10-30
          相关资源
          最近更新 更多