【Rosalind】Locating Restriction Sites - 活学活用之再次使用all()

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。所以如果全部都是符合配对的,就是要找的序列啦!

感想

刚刚开始学习代码的时候,感觉总是需要去查别人写的代码,去想别人写的时候是一个什么样的思路。慢慢的发现自己学习到的东西,也会被反复使用,然后再反复使用的过程中加深了对这个内容的理解!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EmmettPeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值