【问题标题】:How to iterator over every [:2] overlapping characters in a string of DNA code?如何迭代 DNA 代码字符串中的每个 [:2] 重叠字符?
【发布时间】:2013-12-11 05:43:50
【问题描述】:

假设我有一串 DNA 'GAAGGAGCGGCGCCCAAGCTGAGATAGCGGCTAGAGGCGGGTAACCGGCA'

考虑前 5 个字母:GAAGG

我想用与它们出现的可能性相对应的某个数字替换每个重叠的二元组 'GA','AA','AG','GG',并将它们相加。比如'GA' = 1,'AA' = 2,'AG' = .7,'GG' = .5。所以对于 GAAGG,我的 sumAnswer = 1 + 2 + .7 + 5。

所以在伪代码中,我想... - 遍历我的 DNA 字符串中的每个重叠的二元组 - 找到每个唯一二元组对的对应值 - 迭代地对每个值求和

我不确定如何迭代每一对。我认为 for 循环会起作用,但这并不能解释重叠:它打印每 2 对 (GAGC = GA,GC),而不是每个重叠的 2 对 (GAGC = GA,AG,GC)

for i in range(0, len(input), 2):
      print input[i:i+2]

有什么建议吗?

【问题讨论】:

    标签: python string for-loop iterator n-gram


    【解决方案1】:

    我会使用more_itertools中描述的pairwise函数

    【讨论】:

      【解决方案2】:

      我编写了一个小型实用程序库,其中包含一个名为 paired 的函数,它几乎完全符合您的要求。该库可用here

      import iterlib
      
      sequence = 'GAAGG'
      bigrams = [''.join(bigram_tuple) for bigram_tuple in iterlib.paired(sequence)]
      
      print(bigrams)
      

      【讨论】:

        【解决方案3】:

        忘记使用range 和索引算法吧,迭代对正是zip 的用途:

        >>> dna = 'GAAGG'
        >>> for bigram in zip(dna, dna[1:]):
        ...    print(bigram)
        ... 
        ('G', 'A')
        ('A', 'A')
        ('A', 'G')
        ('G', 'G')
        

        如果您将相应的可能性存储在字典中,如下所示:

        likelihood = {
           'GA': 1, 
           'AA': 2,
           'AG': .7, 
           'GG': .5
        }
        

        然后你可以很容易地将它们与毫不奇怪的sum相加:

        >>> sum(likelihood[''.join(bigram)] for bigram in zip(dna,dna[1:]))
        4.2
        

        【讨论】:

          【解决方案4】:

          other answer 应该这样做。

          如果你真的想要一个迭代器:

          # define the iterator
          def dnaiter(input): 
              for i in xrange(0, len(input) - 1): 
                  yield input[i:i+2]
          
          # then use the iterator
          for s in dnaiter(input): 
              print s
          

          不过,如果您有一个 非常 长的序列并且您正在迭代,您将只需要它。

          【讨论】:

            【解决方案5】:

            只需在您的范围内省略 ,2 并确保不要到达字符串的最后:

            for i in range(0, len(input)-1):
                print input[i:i+2]
            

            ,2 告诉 Python 在每次迭代中前进两步。忽略它,您默认向前迈出一步。

            【讨论】:

            • 在循环中使用 range 和 len 几乎总是一种代码味道。
            猜你喜欢
            • 1970-01-01
            • 2010-10-07
            • 2019-08-09
            • 1970-01-01
            • 2010-12-01
            • 2010-10-24
            • 2019-07-15
            • 1970-01-01
            相关资源
            最近更新 更多