如何迭代遍历DNA代码字符串中每个[:2]重叠的字符?

4
假设我有一个DNA字符串“GAAGGAGCGGCGCCCAAGCTGAGATAGCGGCTAGAGGCGGGTAACCGGCA”。
考虑前5个字母:GAAGG
我想用一些数字替换每个重叠的二元组'GA','AA','AG','GG',这些数字对应于它们出现的可能性,并将它们相加。例如,“GA”=1,“AA”=2,“AG”=0.7,“GG”=0.5。因此,对于GAAGG,我的sumAnswer = 1 + 2 + 0.7 + 0.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]

有什么技巧吗?

5个回答

10

别再去玩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

5

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

for i in range(0, len(input)-1):
    print input[i:i+2]
< p >“,2”表示Python每次迭代向前移动两个。如果不设置,则默认向前移动一个。


在循环中使用len和range几乎总是一种代码异味。 - Mark Lawrence

1

0

我写了一个小型的实用库,其中有一个名为paired的函数,几乎可以满足您的需求。该库可以在这里找到。

import iterlib

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

print(bigrams)

0

其他答案应该可以解决。

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

# 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

只有在您需要迭代非常长的序列时才需要使用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接