2021-12-10 xty rosalind 1-10

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)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容