假设我有一串DNA‘GAAGGCGCCCAAGCTGAAGCGGCTAGAGGCGGTAACCGGCA’
考虑前5个字母:GAAGG
我想用与它们出现的可能性相对应的一些数字来替换每个重叠的双字母"GA"、"A"、"G"、"GG",并对它们求和。像"GA"=1,"AA"=2,"AG"=.7,"GG"=.5。所以对于GAAGG,我的sumAnswer=1+2+.7+5。
所以在pseduo代码中,我想。。。-在我的DNA串中的每个重叠的双链上迭代-找到每个唯一的双字符对的对应值-迭代求和每个值
我根本不确定如何对每一对进行迭代。我以为for循环会起作用,但这并不能解释重叠:它打印每个2对(GAGC=GA,GC),而不是每个重叠的2对(GAGC=GA、AG,GC)
for i in range(0, len(input), 2):
print input[i:i+2]
有什么建议吗?
忘记玩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
只需在您的范围中去掉,2
,并确保不会到达字符串的最后:
for i in range(0, len(input)-1):
print input[i:i+2]
,2
命令Python在每次迭代中前进两步。如果忽略它,则默认为前进一步。
我会使用more_itertools
其他答案应该可以。
如果你真的想要一个迭代器:
# 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
不过,只有当你有一个真的的长序列时,你才会需要这个。
我编写了一个小型实用程序库,该库有一个名为paired
的函数,它几乎完全符合您的要求。这里有图书馆。
import iterlib
sequence = 'GAAGG'
bigrams = [''.join(bigram_tuple) for bigram_tuple in iterlib.paired(sequence)]
print(bigrams)