2021-12-10 xty rosalind 1-10
2021-12-10 本文已影响0人
徐添添
Problem1:给定一个DNA字符串s,计算符号“A”、“C”、“G”和“T”在s中的出现次数。
cnts = {c:0 for c in 'ATCG'} #创建一个集合,集合里面有四个元素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转为RNA。(即用"U"替换"T")
with open('task2 .txt', 'r') as f:
data = f.read().strip('\n') # 3种读取文件的方法
# read([size]) 函数:逐个字节或者字符读取文件中的内容;size代表读取的最大字节数
# readline() 函数:逐行读取文件中的内容;
# readlines() 函数:一次性读取文件中多行内容
# str.strip():移除字符串头尾指定的字符(默认为空格或换行符)。如sri.strip(‘0’)。
print(data.replace("T", "U")) #str.replace(old, new[, max])用new替换str中的old,最大次数为m
Problem3:DNA互补链
data = f.read().strip('\n') #逐个字节读取
st = data.replace('A', 't').replace('T', 'a').replace('C', 'g').replace('G', 'c').upper()[::-1] #str[::-1]:倒序排列字符串
print(st)
Problem4:斐波那切数列
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个数)
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的个数)
seqGC[SeqName] += line.count('C') #SeqGC字典里,添加一个键值对,key(序列ID):value(序列字符串里G+C的个数)
maxGC = 0
for key,value in Seq.items(): #遍历seq字典
if maxGC < float(seqGC[key]/ len(value)*100): #如果maxGC<a=【seqGC字典里的key的value/seq字典里对应的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:计算点突变个数
lst = [] #创建空列表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,隐性纯合子。
# 假设这对形状由一对等位基因控制,且群体中随机选取的任何两个个体都能交配,求随机选取两个个体交配后,子代拥有显性等位基因的概率。
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翻译为蛋白质
def translate_rna(sequence):
codonTable = { #创建一个字典,key是密码子,value是蛋白质
'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 = ''#蛋白质序列先设定为空字符串
for n in range(0,len(sequence),3): #[0,stop),步长为3.左闭右开
if sequence[n:n+3] in codonTable.keys(): #如果RNA序列的第[n,n+3)字符串在密码子转换表的key中
proteinsequence += codonTable[sequence[n:n+3]] #蛋白质序列字符串添加key对应的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中找结构域
seq = 'GATATATGCATATACTT'
motif = 'ATAT'
motif_len = len(motif) #结构域的长度
position = [] #创建一个存放位置的列表
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

prodile:每一列ACGT出现的次数
consensus:每一列出现次数最多的碱基
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每一列出现的次数存放在base_total列表中
for sit in range(len(seq_list[0])): #对应序列第1-8列,从第一列开始
col = [x[sit] for x in seq_list] #col集合存放第一列的碱基
num = col.count(base) #数第一列A出现的次数
base_total.append(num)#将第一列A出现的次数放在base_total列表
print(base,base_total) #循环完后,将1-8列A出现的次数放在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)