【问题标题】:Tuple to table from counting DNA sequences从计数 DNA 序列到表格的元组
【发布时间】:2018-11-26 06:32:48
【问题描述】:

我想计算 DNA 序列中的碱基数,返回序列中每种碱基的计数,并打印出一个两列表,其中第一列是碱基,第二列是相关联的基数。我可以获得返回基本计数的函数,但我不确定如何打印表格。我想用基本的python函数来做这个分析,虽然我认为用一些python模块做起来会更容易。

代码:

 def base_counter(DNA):
    A = 0
    T = 0
    G = 0
    C = 0
    for base in DNA:
        if base == "A":
            A = A + 1
        elif base == "T":
            T = T + 1
        elif base == "G":
            G = G + 1
        elif base == "C":
            C = C + 1
        else:
            pass
    return A,T,G,C

参数输入:

dna="AAGCTACGTGGGTGACTTT"

函数调用:

counts=base_counter(dna)
print(counts)

输出:

(4, 6, 6, 3)

期望的输出:

print(counts)
  A   4
  T   6
  G   6
  C   3

counts
(4, 6, 6, 3)

【问题讨论】:

    标签: python dna-sequence


    【解决方案1】:

    您可以使用collections.Counter 对碱基进行计数,并使用pandas 以按列的方式设置数据。这是一个例子

    from collections import Counter
    import pandas as pd
    
    # Count the bases
    dna="AAGCTACGTGGGTGACTTT"
    count = Counter(dna)
    tup = ()
    for _, value in sorted(count.items()):
      tup += (value,)
    print(tup  # Outputs (4, 3, 6, 6)
    
    # Set it in a pandas dataframe
    df = pd.DataFrame(list(dict(count).items()), columns=['Base', 'Count'])
    print(df.to_string(index=False))
    # Output
    # Base  Count
    #   A      4
    #   G      6
    #   C      3
    #   T      6
    

    【讨论】:

      【解决方案2】:

      1) 你有一个错误 - 你的 return 向右缩进了一个额外的标签

      2) 使用dict:

      def base_counter(DNA):
          dna_dict = {
              "A": 0,
              "T": 0,
              "G": 0,
              "C": 0,
          }
          for base in DNA:
              if base == "A":
                  dna_dict["A"] += 1
              elif base == "T":
                  dna_dict["T"] += 1
              elif base == "G":
                  dna_dict["G"] += 1
              elif base == "C":
                  dna_dict["C"] += 1
          return dna_dict
      
      
      dna = "AAGCTACGTGGGTGACTTT"
      
      counts = base_counter(dna)
      for base, count in counts.items():
          print(base, count)
      

      但如果您必须保持功能不变:

      def base_counter(DNA):
          A = 0
          T = 0
          G = 0
          C = 0
          for base in DNA:
              if base == "A":
                  A = A + 1
              elif base == "T":
                  T = T + 1
              elif base == "G":
                  G = G + 1
              elif base == "C":
                  C = C + 1
          return A,T,G,C
      
      
      dna = "AAGCTACGTGGGTGACTTT"
      
      counts = base_counter(dna)
      for base, count in zip("ATGC", counts):
          print(base, count)
      

      【讨论】:

      • 输出必须如我的帖子中所示(即 (4, 6, 6, 3) 而不是 {'A': 4, 'T': 6, 'G': 6, “C”:3})
      • 所以,保持你的函数原样(只是不要忘记取消缩进return,并将函数调用代码sn-p替换为:counts = base_counter(dna); for base, count in zip("ATGC", counts): print(base, count)
      • 你能用这个解决方案更新你的答案吗?
      • 您可以使用更简单的for base in DNA: dna_dict[base] += 1 在字典方法(我更喜欢)中省略ifs。这是以无法处理无效字符为代价的,但它适用于 OP。 (虽然添加错误处理程序也应该很容易。)
      【解决方案3】:

      从函数内部:

      out_str="A    "+str(A)+"\n"+\
            "T    "+str(T)+"\n"+\
            "G    "+str(G)+"\n"+\
            "C    "+str(C)
      return out_str
      

      现在您可以调用并打印它,它将以您想要的格式打印:

      result=base_counter(DNA)
      print(result)
      

      对于OP的请求完整代码:

      def base_counter(DNA):
          A = 0
          T = 0
          G = 0
          C = 0
          for base in DNA:
              if base == "A":
                  A = A + 1
              elif base == "T":
                  T = T + 1
              elif base == "G":
                  G = G + 1
              elif base == "C":
                  C = C + 1
          out_str = "A    " + str(A) + "\n"+\
          "T    " + str(T) + "\n"+\
          "G    " + str(G) + "\n"+\
          "C    " + str(C)
          return out_str
      
      base=base_counter("AAGCTACGTGGGTGACTTT")
      print(base)
      

      输出:

      A    4
      T    6
      G    6
      C    3
      

      【讨论】:

      • 我希望能够做到这一点:counts=base_counter(dna) print (counts) 而不是在函数中打印
      【解决方案4】:

      你可以创建另一个函数来打印结果:

      def print_bases(bases):
      print("A    "+str(bases[0])+"\n"
        "T    "+str(bases[1])+"\n"
        "G    "+str(bases[2])+"\n"
        "C    "+str(bases[3]))
      print_bases(counts)
      

      【讨论】:

      • 有没有办法在同一个函数中做到这一点,使得函数在运行 base_counter(dna) 后返回元组 ((4, 6, 6, 3)) 然后能够打印按打印(计数)表)?所以基本上是你的第一个解决方案的相反输出。您的第一个解决方案返回表并打印元组。
      • 从第一个解决方案开始,您可以返回一个字符串(正是 print 函数中写的内容),然后当您调用该函数时,它将返回一个字符串,您可以使用 print( ) 函数
      • 我应该问一个新问题吗?如果没有你刚才提到的例子,很难理解。
      • 你可以通过返回计数器并创建一个额外的函数来打印它们来实现它,就像我在这里向你展示的那样,或者将 reaults 作为一个字符串返回,已经像上面那样格式化,就像我在我的编辑中所做的那样原始答案,您可以直接打印,希望这会有所帮助:)
      • 我收到一个缩进错误,它只从表中打印 A 4
      猜你喜欢
      • 1970-01-01
      • 2014-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多