Problem1:給定一個DNA字符串s,計算符號“A”、“C”、“G”和“T”在s中的出現(xiàn)次數(shù)。
cnts = {c:0 for c in 'ATCG'} #創(chuàng)建一個集合,集合里面有四個元素A\T\C\G
for line in open("task1 dna nuclear.txt", 'r'): #逐行讀取文件
for c in line.rstrip(): #str.rstrip() 刪除字符串末尾的指定字符,默認為空白符,包括空格、換行符、回車符、制表符。
cnts[c] += 1
print(cnts)
Problem2:將DNA轉(zhuǎn)為RNA。(即用"U"替換"T")
with open('task2 .txt', 'r') as f:
data = f.read().strip('\n') # 3種讀取文件的方法
# read([size]) 函數(shù):逐個字節(jié)或者字符讀取文件中的內(nèi)容;size代表讀取的最大字節(jié)數(shù)
# readline() 函數(shù):逐行讀取文件中的內(nèi)容;
# readlines() 函數(shù):一次性讀取文件中多行內(nèi)容
# str.strip():移除字符串頭尾指定的字符(默認為空格或換行符)。如sri.strip(‘0’)。
print(data.replace("T", "U")) #str.replace(old, new[, max])用new替換str中的old,最大次數(shù)為m
Problem3:DNA互補鏈
data = f.read().strip('\n') #逐個字節(jié)讀取
st = data.replace('A', 't').replace('T', 'a').replace('C', 'g').replace('G', 'c').upper()[::-1] #str[::-1]:倒序排列字符串
print(st)
Problem4:斐波那切數(shù)列
k=input("k is:")
fn =[1,1]; #[]是列表
bool_list=[1,1,0];
for i in range(2,int(n)): #range(a,b),從a到b-1
if(bool_list[i]==0):
fn.append(fn[i-1]+int(k)*fn[i-2]) #():在列表的末尾添加一個元素
bool_list[i]=1
bool_list.append(0)
i+=1;
else:
bool_list.append(0)
i+=1;
print(fn[int(n)-1])
Problem5:C計算GC含量,返回GC含量最多的字符串ID
import re #加載正則表達式
Seq = {} #字典,key(序列ID):value(序列)
seqGC = {} #字典,key(序列ID):value(序列GC個數(shù))
with open('task5.txt','r') as f:
for line in f: #逐個字符讀取
if re.match(">",line): #如果這一行(序列ID)有‘>’
SeqName = line[1:] #SeqName變成序列ID(從第二個字符開始,不包括>)
Seq[SeqName] = '' #Seq字典里,定義一個key為序列ID,值為空
seqGC[SeqName] = 0 #SeqGC字典里,定義一個key為序列ID,值為空
else: #n+1行(序列)沒有‘>’
line = line.upper() #n+1行字符串大寫
line = line.rstrip()
Seq[SeqName] += line #Seq字典里,添加一個鍵值對,key(序列ID):value(序列)
seqGC[SeqName] += line.count('G') #SeqGC字典里,添加一個鍵值對,key(序列ID):value(0+序列字符串里G的個數(shù))
seqGC[SeqName] += line.count('C') #SeqGC字典里,添加一個鍵值對,key(序列ID):value(序列字符串里G+C的個數(shù))
maxGC = 0
for key,value in Seq.items(): #遍歷seq字典
if maxGC < float(seqGC[key]/ len(value)*100): #如果maxGC<a=【seqGC字典里的key的value/seq字典里對應(yīng)的key的value(序列字符串)的長度】
maxGC = float(seqGC[key] / len(value)*100) #maxGC=a
tmp = key #tmp=序列ID
print ('>'+tmp+Seq[tmp]) #顯示> + 序列ID + 序列
print (tmp) #顯示序列ID
print(float(maxGC)) #顯示最大的GC含量
Problem6:計算點突變個數(shù)
lst = [] #創(chuàng)建空列表lst
for line in fh: #遍歷行
print(line)
lst.append(line.rstrip()) #每一行作為lst的一個元素
hamming_dis = 0
for i in range(len(lst[0])): #lst[0]代表第一行字符串,1-第一行字符串的長度
if lst[0][i] == lst[1][i]: #如果第一行字符串的第一個字符和第二行字符串的第一個字符相等
continue
hamming_dis += 1
print (hamming_dis)
Problem7:孟德爾第一定律
#一個群體中有三種基因型的生物:k,顯性純合子;m,雜合子;n,隱性純合子。
# 假設(shè)這對形狀由一對等位基因控制,且群體中隨機選取的任何兩個個體都能交配,求隨機選取兩個個體交配后,子代擁有顯性等位基因的概率。
k =22
m = 25
n = 16
num = int(k + m + n)
choice = num*(num-1)/2.0
p = 1 - (n*(n-1)/2 + 0.25*m*(m-1)/2 + m*n*0.5)/choice
print(p)
Problem8:RNA翻譯為蛋白質(zhì)
def translate_rna(sequence):
codonTable = { #創(chuàng)建一個字典,key是密碼子,value是蛋白質(zhì)
'AUA':'I', 'AUC':'I', 'AUU':'I', 'AUG':'M',
'ACA':'T', 'ACC':'T', 'ACG':'T', 'ACU':'T',
'AAC':'N', 'AAU':'N', 'AAA':'K', 'AAG':'K',
'AGC':'S', 'AGU':'S', 'AGA':'R', 'AGG':'R',
'CUA':'L', 'CUC':'L', 'CUG':'L', 'CUU':'L',
'CCA':'P', 'CCC':'P', 'CCG':'P', 'CCU':'P',
'CAC':'H', 'CAU':'H', 'CAA':'Q', 'CAG':'Q',
'CGA':'R', 'CGC':'R', 'CGG':'R', 'CGU':'R',
'GUA':'V', 'GUC':'V', 'GUG':'V', 'GUU':'V',
'GCA':'A', 'GCC':'A', 'GCG':'A', 'GCU':'A',
'GAC':'D', 'GAU':'D', 'GAA':'E', 'GAG':'E',
'GGA':'G', 'GGC':'G', 'GGG':'G', 'GGU':'G',
'UCA':'S', 'UCC':'S', 'UCG':'S', 'UCU':'S',
'UUC':'F', 'UUU':'F', 'UUA':'L', 'UUG':'L',
'UAC':'Y', 'UAU':'Y', 'UAA':'', 'UAG':'',
'UGC':'C', 'UGU':'C', 'UGA':'', 'UGG':'W',
}
proteinsequence = ''#蛋白質(zhì)序列先設(shè)定為空字符串
for n in range(0,len(sequence),3): #[0,stop),步長為3.左閉右開
if sequence[n:n+3] in codonTable.keys(): #如果RNA序列的第[n,n+3)字符串在密碼子轉(zhuǎn)換表的key中
proteinsequence += codonTable[sequence[n:n+3]] #蛋白質(zhì)序列字符串添加key對應(yīng)的value
return proteinsequence
protein_fh = open('task8 protein.txt','w')
with open('task8.txt','r') as f:
for line in f:
protein_fh.write(translate_rna(line.strip('\n')))
Problem9:DNA中找結(jié)構(gòu)域
seq = 'GATATATGCATATACTT'
motif = 'ATAT'
motif_len = len(motif) #結(jié)構(gòu)域的長度
position = [] #創(chuàng)建一個存放位置的列表
for i in range(len(seq)-motif_len): #0~seq長度減去motif長度
if seq[i:i+motif_len] == motif: #seq字符串中第i+1~第i+motif位置的字符串如果等于motif
position.append(i+1) #位置列表中添加元素i+1
print(position)
Problem10:consensus和profile

example.png
prodile:每一列ACGT出現(xiàn)的次數(shù)
consensus:每一列出現(xiàn)次數(shù)最多的堿基
a=open('task10.txt','r')
seq_list = []
for line in a.readlines():
if not line.startswith('>'):
seq = list(line.rstrip())
seq_list.append(seq)
tt=[]
for base in 'ACGT': #遍歷字符串,從堿基A開始
base_total = [] #堿基A每一列出現(xiàn)的次數(shù)存放在base_total列表中
for sit in range(len(seq_list[0])): #對應(yīng)序列第1-8列,從第一列開始
col = [x[sit] for x in seq_list] #col集合存放第一列的堿基
num = col.count(base) #數(shù)第一列A出現(xiàn)的次數(shù)
base_total.append(num)#將第一列A出現(xiàn)的次數(shù)放在base_total列表
print(base,base_total) #循環(huán)完后,將1-8列A出現(xiàn)的次數(shù)放在base_total列表
tt.append(base_total)
common = ''
a=tt[0]
c=tt[1]
g=tt[2]
t=tt[3]
for i in range(8):
if max(a[i], c[i], g[i], t[i]) == a[i]:
common += 'A'
elif max(a[i], c[i], g[i], t[i]) == c[i]:
common += 'C'
elif max(a[i], c[i], g[i], t[i]) == g[i]:
common += 'G'
elif max(a[i], c[i], g[i], t[i]) == t[i]:
common += 'T'
print(common)