????之前在公司時(shí)就發(fā)現(xiàn)了Rosalind這個(gè)神奇的網(wǎng)站患膛,作為生信的python入門(mén)練習(xí)簡(jiǎn)直是Perfect裤翩。不過(guò)那時(shí)沒(méi)有太多時(shí)間去做這種練習(xí)題,最近在做數(shù)據(jù)處理時(shí)發(fā)現(xiàn)幾乎快把python都忘完了,趕緊撿起來(lái)回顧一下位他,今天看看第一題。
Counting DNA Nucleotides
????第一個(gè)問(wèn)題相對(duì)來(lái)說(shuō)比較簡(jiǎn)單产场,題目會(huì)隨機(jī)生成一段DNA序列鹅髓,需要在五分鐘內(nèi)上傳A、C京景、G窿冯、T四種堿基分別有多少個(gè)。
#Sample Dataset
AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTCTGTGTGGATTAAAAAAAGAGTGTCTGATAGCAGC
#Sample Output
20 12 17 21
????這樣的問(wèn)題放在python中确徙,只需一個(gè)方法就可以搞定醒串,那就是count()
。
????count()
方法用于統(tǒng)計(jì)字符串里某個(gè)字符出現(xiàn)的次數(shù)鄙皇,可選參數(shù)為在字符串搜索的開(kāi)始與結(jié)束位置芜赌。它的語(yǔ)法如下:
str.count(sub, start= 0,end=len(string))
????在這題當(dāng)中,并不需要什么特別的技巧伴逸,我采用了最笨最懶的辦法缠沈,就是直接在python命令行中輸入。
>>> a="AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTCTGTGTGGATTAAAAAAAGAGTGTCTGATAGCAGC"
>>> print(a.count("A"))
20
>>> print(a.count("C"))
12
>>> print(a.count("G"))
17
>>> print(a.count("T"))
21
????果然簡(jiǎn)單粗暴错蝴,適合我這樣半吊子還失憶的新手司機(jī)洲愤!
????光速搞定之后,我開(kāi)始瀏覽答案區(qū)大佬們的腳本顷锰,事實(shí)證明柬赐,只要你的python水平夠高,多簡(jiǎn)單的題目都可以秀馍惹,有的時(shí)候?qū)W習(xí)其他人的腳本也能夠提升自己躺率。
????有跟我一樣的耿直型,寫(xiě)得比課本還規(guī)整万矾,一看就是處女座悼吱,這個(gè)格式要表?yè)P(yáng)一下:
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"))
????我查了一下他的這種寫(xiě)法,map()
會(huì)根據(jù)提供的函數(shù)對(duì)指定序列做映射良狈。第一個(gè)參數(shù)function
以參數(shù)序列中的每一個(gè)元素調(diào)用function
函數(shù)后添,返回包含每次function
函數(shù)返回值的新列表。
????在這里薪丁,function
函數(shù)就是對(duì)輸入序列所做的count()
遇西,而四個(gè)堿基就是序列馅精,等于每一個(gè)元素放進(jìn)去調(diào)用一次。至于外面的*
用于輸出可迭代對(duì)象粱檀,并且以空格分隔洲敢,正好與題目所給的格式相契合。
????雖然大佬的精簡(jiǎn)寫(xiě)法一時(shí)不一定能學(xué)會(huì)茄蚯,但是積累得越多压彭,以后肯定用得上!