Rosalind习题:Locating Restriction Sites (题目ID:REVP)
今天的一道习题很简单,我在做的过程中想到了用之前学到的all()
函数,用很简洁的代码就完成了好像很复杂的一件事情,其实没有新内容,只是为了自己的**活学活用(现学现卖)**更一篇博客。
Problem
A DNA string is a reverse palindrome if it is equal to its reverse complement. For instance, GCATGC is a reverse palindrome because its reverse complement is GCATGC. See Figure 2.
Given: A DNA string of length at most 1 kbp in FASTA format.
Return: The position and length of every reverse palindrome in the string having length between 4 and 12. You may return these pairs in any order.
Sample Dataset
>Rosalind_24
TCAATGCATGCGGGTCTATATGCAT
Sample Output
4 6
5 4
6 6
7 4
17 4
18 4
20 6
21 4
思路
这道题很简单,就是需要找出所给序列中的回文结构,回文结构的意思就是像GCATGC
这样的序列本身和它的反向互补序列相同。 观察这样的回文序列,我就发现了,这样的序列第n个位置的碱基和倒数第n个位置的碱基,必然是A-T或者是G-C,这样他反过来互补才能是一样的。 掌握了这个规律,我就可以对所有的序列进行筛选了,只要大序列中找到切出小序列满足小序列中所有的正数倒数第n个碱基都是A-T或者G-C,就可以输出。
我的代码
'''
Rosalind Problems: Locating Restriction Sites
Problem ID: REVP
http://rosalind.info/problems/revp/
A DNA string is a reverse palindrome if it is equal to its reverse complement. For instance, GCATGC is a reverse palindrome because its reverse complement is GCATGC. See Figure 2.
Given: A DNA string of length at most 1 kbp in FASTA format.
Return: The position and length of every reverse palindrome in the string having length between 4 and 12. You may return these pairs in any order.
'''
def palindrome(s, k):
#k must be even numbers
palindrome_pairs = [('A','T'),('T','A'),('G','C'),('C','G')]
for i in range(len(s)-k+1):
test = s[i:i+k]
if all((test[j],test[k-j-1]) in palindrome_pairs for j in range(k)):
#print(test, i+1, k)
print(i+1, k)
string = 'TATATACCGGCTGACCCTTCTAGTGAGAGCCCGAAGAGGTACAATCATCGCTCAGAGCGGGGAGCACGATGATATGCCCACTCAAAGCTCGCGCTATCCCCTTAGAGCACCGAGTATAAGACGGCCCCAAAGCACGGGTATCAGGGTAGCACGTAAAAGTCGTTGTTGTAAATTGGCGTCGCATTACCCTATTGCTCTGAAGTAAGCCAAAAAATCCGATGTTCGGTGTTGAATGTTCATGCAGCAGGCCCGAAAAATCTAGTTGAGTCAATACGATTGGCCCCCCGACCAGCACCTGAAGCGAACGTGTACCAGTGGCTCCCTACATAATCGTGCGACTAGGCTATCGCCACCTCTCACTTGTAGTGAACTACTCTCTAGTCCGCAGGCAGCTCACATACGATTTCTCATTACCTCCCAAGCGAGCATCACCAAGAGTAGGATCGATGTCGGCCCTGAAGGCCACTCTGGAACTACCTTAAATCTTTATGTCCGGACATCAAGGACAAGATTTAACCCTCCCTATAAGTTCAACGAGGAATGGCGCCGCGTGCACCGTGAGACTGTAAAAGCCGGCTGTTCGTTACTCCCTGGATGCAACCCAAGTCAAGTATGTTAAAAAATCCCGATATGATGTTTACAGTACGCGTCACGAAATTCTATAGTTAATCTTCGGGTATATATGCTGTCTTATTAATTAGTACGCATTGCGGGCATCCAGCAACCGTGGAGTACTCAAACTTCAAAGGGTCCGCCCTTATGCCATCAGTGGGACTTTCTACAGGTACAATCGGTCGTCTTAGCCGCATTAGCATTCCCACGTCGAGGCCCCTCTCGGAGCTGGTTGCATTATGGACTAGCATCGGTATGCGCGATACTTGGAAGCCTCCCCTTAATCATACAGGAGCCGTAGGTTCCAATATCAAGCGCGGGTCGACGAATCGGAATTCTAGGAGGATTATCTTTTATCAGGCGCACCGACGCTATA'
for i in range(4,14,2):
palindrome(string, i)
最核心的筛选就是在这一步: if all((test[j],test[k-j-1]) in palindrome_pairs for j in range(k)):``all()
就是检验之后的一个列表是不是全为True
,如果是的,那就返回True
,不是就返回False
。所以如果全部都是符合配对的,就是要找的序列啦!
感想
刚刚开始学习代码的时候,感觉总是需要去查别人写的代码,去想别人写的时候是一个什么样的思路。慢慢的发现自己学习到的东西,也会被反复使用,然后再反复使用的过程中加深了对这个内容的理解!