【问题标题】:Complementary DNA sequence互补DNA序列
【发布时间】:2013-09-17 05:12:03
【问题描述】:

我在编写这个循环时遇到了问题;它似乎在第二个序列之后停止。

我想将互补 DNA 序列返回给给定的 DNA 序列。

例如('AGATTC') -> ('TCTAAG'),其中 A:T 和 C:G

def get_complementary_sequence(dna):
    """(str) -> str

> Return the DNA sequence that is complementary to the given DNA sequence

    >>> get_complementary_sequence('AT')
    ('TA')
    >>> get_complementary_sequence('AGATTC')
    ('TCTAAG')

    """

    x = 0
    complementary_sequence = ''

    for char in dna:
            complementary_sequence = (get_complement(dna))

    return complementary_sequence + (dna[x:x+1])

谁能发现循环不继续的原因?

【问题讨论】:

  • get_complement 是做什么的?
  • get_complement 产生互补碱基对,例如。 'A':'T'

标签: for-loop python-3.x sequence


【解决方案1】:

下面是一个例子——实际上只有两行代码:

from string import maketrans

DNA="CCAGCTTATCGGGGTACCTAAATACAGAGATAT" #example DNA fragment

def complement(sequence):
  reverse = sequence[::-1]
  return reverse.translate(maketrans('ATCG','TAGC'))

print complement(DNA)

【讨论】:

    【解决方案2】:

    怎么了?

    你来电:

    complementary_sequence = (get_complement(dna))
    

    ...n 次,其中 n 是字符串的长度。这让你得到get_complement(dna) 的返回值在complementary_sequence 中的任何值。大概只有一个字母。

    然后您返回这一个字母 (complementary_sequence),后跟子字符串 dna[0:1]dna 中的第一个字母),因为x 始终是 em> 0.

    这就是为什么总是返回两个字符的原因。

    如何解决?

    假设你有这样的功能:

    def get_complement(d):
        return {'T': 'A', 'A': 'T', 'C': 'G', 'G': 'C'}.get(d, d)
    

    ...您可以通过简单地使用str.join()list comprehension 来修复您的功能:

    def get_complementary_sequence(dna):
        """(str) -> str
    
    > Return the DNA sequence that is complementary to the given DNA sequence
    
        >>> get_complementary_sequence('AT')
        ('TA')
        >>> get_complementary_sequence('AGATTC')
        ('TCTAAG')
    
        """
    
        return ''.join([get_complement(c) for c in dna])
    

    【讨论】:

      【解决方案3】:

      您在所有dna 上调用get_complement,而不是每个char。这将简单地使用相同的参数 len(dna) 次调用 come 函数。如果您从不使用 chars,就没有理由循环它们。如果get_complement() 可以带一个字符,我会推荐:

      for char in dna:
          complementary_sequence += get_complement(char)
      

      get_complement 的实现将采用单个字符并返回其补码。

      另外,您将返回complementary_sequence + (dna[x:x+1])。如果您希望函数符合您记录的行为,+ (dna[x:x+1]) 将从 dna 字符串的开头添加一个额外的(错误的)字符。您只需返回complementary_sequence!感谢@Kevin 的关注。

      你在做什么:

      >>> dna = "1234"
      >>> for char in dna:
      ...     print dna
      ... 
      1234
      1234
      1234
      1234
      

      我认为更接近你想做的事情:

      >>> for char in dna:
      ...     print char
      ... 
      1
      2
      3
      4
      

      把它们放在一起:

      # you could also use a list comprehension, with a join() call, but
      # this is closer to your original implementation.
      def get_complementary_sequence(seq):
          complement = ''
          for char in seq:
              complement += get_complement(char)
          return complement
      
      def get_complement(base):
          complements = {'A':'T', 'T':'A', 'C':'G', 'G':'C'}
          return complements[base]
      
      >>> get_complementary_sequence('AT')
      'TA'
      >>> get_complementary_sequence('AGATTC')
      'TCTAAG'
      

      【讨论】:

      • @user2773611 这会打印互补字符串
      • 刚刚试了上面的代码,只产生了:get_complementary_sequence('AGATTC') return 'T'
      • @user2773611 我认为你误解了我的解释。我已经编辑给你一个完整的工作版本。也许我理解 get_complement 应该做错什么。
      • 你的 get_complement 效果很好,它只是当我运行 get_complementary_sequence('AGATTC') 我得到 ('T')
      • @user2773611 你使用的是我实现的那个吗?正如您从测试用例中看到的那样,它有效。您确定循环正确缩进吗?如果不是,它可能会运行一次,您就会看到这种行为。
      猜你喜欢
      • 1970-01-01
      • 2013-12-20
      • 1970-01-01
      • 2014-10-01
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多