之前在公司时就发现了Rosalind这个神奇的网站,作为生信的python入门练习简直是Perfect。不过那时没有太多时间去做这种练习题,最近在做数据处理时发现几乎快把python都忘完了,赶紧捡起来回顾一下,今天看看第一题。
Counting DNA Nucleotides
第一个问题相对来说比较简单,题目会随机生成一段DNA序列,需要在五分钟内上传A、C、G、T四种碱基分别有多少个。
#Sample Dataset
AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTCTGTGTGGATTAAAAAAAGAGTGTCTGATAGCAGC
#Sample Output
20 12 17 21
这样的问题放在python中,只需一个方法就可以搞定,那就是count()
。
count()
方法用于统计字符串里某个字符出现的次数,可选参数为在字符串搜索的开始与结束位置。它的语法如下:
str.count(sub, start= 0,end=len(string))
在这题当中,并不需要什么特别的技巧,我采用了最笨最懒的办法,就是直接在python命令行中输入。
>>> a="AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTCTGTGTGGATTAAAAAAAGAGTGTCTGATAGCAGC"
>>> print(a.count("A"))
20
>>> print(a.count("C"))
12
>>> print(a.count("G"))
17
>>> print(a.count("T"))
21
果然简单粗暴,适合我这样半吊子还失忆的新手司机!
光速搞定之后,我开始浏览答案区大佬们的脚本,事实证明,只要你的python水平够高,多简单的题目都可以秀,有的时候学习其他人的脚本也能够提升自己。
有跟我一样的耿直型,写得比课本还规整,一看就是处女座,这个格式要表扬一下:
seq = open('rosalind_dna.txt', 'r')
seq = seq.read()
countA = 0
countC = 0
countG = 0
countT = 0
for n in seq:
if n == 'A':
countA += 1
if n == 'C':
countC += 1
if n == 'G':
countG += 1
if n == 'T':
countT += 1
print str(countA) + ' ' + str(countC) + ' ' + str(countG) + ' ' + str(countT)
也有大佬一行命令搞定:
print(*map(input().count, "ACGT"))
我查了一下他的这种写法,map()
会根据提供的函数对指定序列做映射。第一个参数function
以参数序列中的每一个元素调用function
函数,返回包含每次function
函数返回值的新列表。
在这里,function
函数就是对输入序列所做的count()
,而四个碱基就是序列,等于每一个元素放进去调用一次。至于外面的*
用于输出可迭代对象,并且以空格分隔,正好与题目所给的格式相契合。
虽然大佬的精简写法一时不一定能学会,但是积累得越多,以后肯定用得上!