Python大作业

发布于 2022-05-28  2760 次阅读


简答略记一下我的Python大作业

受害者和嫌疑人沿着莫哈韦沙漠的一条偏远小径徒步旅行。当受害者和嫌疑人能够徒步回到小径起点并接受医疗护理时,受害者处于危急状态。嫌疑人报告说,由于崎岖的地形和受害者的虚弱状况,徒步返回小径头大约需要10个小时。嫌疑人还报告说试图从受害者的腿上吸出毒液(注意:这是无效或不安全的。如果蛇咬伤,请就医,不要试图吸出毒液)。受害者在前往医院的途中死亡。

但是,我们有理由相信可能存在犯规行为。嫌疑人有可疑的搜索历史,包括反复搜索眼镜王蛇毒液对人类的影响,以及与当地爬行动物商店的可疑通信。调查人员担心嫌疑人可能试图将眼镜王蛇毒液注射到假蛇咬伤部位。

法医科学家打电话到现场擦拭受害者的咬伤伤口,并将样本送去进行DNA测序。

毒理学家已经确定了4种可能感兴趣的蛋白质:

  1. AMYS_HUMAN
  2. HRTD_CROAT
  3. ALBU_HUMAN
  4. VESP_OPHH

ORF: 单个DNA序列可以包含编码许多不同氨基酸序列的信息。

当寻找由DNA序列编码的潜在蛋白质时,我们寻.找夹在START和STOP密码子之间的序列(中间没有其他停止密码子! 这些序列称为开放阅读框架 (ORF)。STOP密码子由*表示。给定dna序列要求你分析dna序列可能产生的所有蛋白质需要你编写三个函数。

第一个函数为读取dna序列以字典形式

f = open(file_path,'r') # make sure proteins_of_interest.txt is saved in the same folder!
    flines = f.readlines()  #按行读取文件
    result={}
    temp1=[]
    for line in flines:    #按行循环读取文件
      if line[0]=='>':
          line=line.replace('\n','') #名字行去掉空格
          line=line.replace('>','')  #名字行去掉箭头
          temp1=[]                    #清空列表
      line=line.replace('\n','')    #除了名字行其他行去掉换行
      temp1.append(line)            #把每一行添加到列表中
      result[temp1[0]] =''.join(temp1[1:len(temp1)])#列表从第二个元素到最后一个元素组成字符串作为值,列表第一个元素作为键形成键值对
    return result  #返回字典

第二个函数为将DNA翻译成蛋白质

def dna2protein(dnaSeq, codonTableD):

  result=''
  for i in range(0,len(dnaSeq)-2,3):   #长度减2
    result+=codonTableD[dnaSeq[i:i+3]]#三个一组作为一个氨基酸依次拼接
  return result

第三个函数也是最麻烦的一个函数,这里用了‘麻烦’而不是‘困难’就是想表达这个大作业其实整体程度并不难,只是在字符串的逻辑处理上需要好好斟酌一番。由于本人是python新手(上课没怎么听),所以逻辑或函数用的有漏洞尽请指正

def findORFs(dnaSeq,codonDict):

  result=[]
  string=All_sequences(dnaSeq,codonDict) 
'''  
#All函数为我个人编写的一个求出一条dna序列可
能形成的三种dna序列,并根据碱基互补配对原则求出对应的三条链,这里要注意的是碱基互补配对出的对应链的翻译顺序应是逆置的,所以共将最多六条链(可能会有重复情况)翻译成蛋白值序列
这里需要注意的是我的思维其实是有错误的,我将所有序列翻译成蛋白质后再截取起始密码子和终止密码子之间的蛋白质序列,按照要求应是先截取起始与终止密码子之间的序列再翻译成蛋白质,原则逻辑问题
'''
  startStr='M'     #起始密码子翻译出的蛋白质(ATG)
  endStr='*'       #终止密码子用*表示
  result=set()     #集合有自动去重功能
  for i in range(0,len(string)): #序列个数
    content=string[i]  #这里用一个转接变量来存储需要查找子串的字符串
    end=len(content)   #该字串长度查找时的终止位置
    sta=0              #查找时的起始位置
    for j in range(0,end):  #最多次循环可能
      startIndex=-1   #查找开始位置
      endIndex=-1     #查找结束位置
      if content.find(startStr,sta,end)==-1 or content.find(endStr,sta,end)==-1: #如果没找到m或*退出该序列判断下一个序列
        break
      startIndex = content.index(startStr,sta,end)   #找到M(ATG)
      endIndex = content.index(endStr,sta,end)      #找到*
      sta=startIndex+1             #找到M后向下移动一位(不可直接跨过此子串,因为该子串可能包含另一个符合要求的子串)
      if endIndex<startIndex:    #此时可直接跳过该子串位置
        sta=endIndex+1
      if startIndex!=-1 and endIndex!=-1 and endIndex>=startIndex:
        result.add(content[startIndex:endIndex])   #将满足条件的子串加到集合里
  result=list(result)    
  result.sort()  #结果要求排序
  return result
#碱基互补出另一条链
def Transcribe(dnaSeq):
  result=''
  for x in dnaSeq:
    if(x=='A'):
      result+='T'
    elif(x=='G'):
      result+='C' 
    elif(x=='C'):
      result+='G'
    elif(x=='T'):
      result+='A'
  return result
#求出一条核苷酸链所有可能形成氨基酸序列
def All_sequences(dnaSeq, codonTableD):
  result=set() #集合可以去重
  result.add(dna2protein(dnaSeq, codonTableD))
  dnaSeq2=Transcribe(dnaSeq)
  dnaSeq2=stringReverse(dnaSeq2)
  result.add(dna2protein(dnaSeq2, codonTableD))
  for i in range(0,2):
    temp=dnaSeq[0]
    dnaSeq=dnaSeq[1:]
    dnaSeq+=temp
    result.add(dna2protein(dnaSeq, codonTableD))
    dnaSeq2=Transcribe(dnaSeq)
    dnaSeq2=stringReverse(dnaSeq2)
    result.add(dna2protein(dnaSeq2, codonTableD))
  result=list(result)
  return result

#逆转字符串
def stringReverse(string):
  result = list(string)
  result.reverse()
  result = ''.join(result)
  return result

综上就是此次大作业主要代码流程,其中dnaseq参数为dna序列,不需要你对其长度负责,传入参数皆为满足三的倍数且都可被翻译,codonDict为提供好的密码子字典。

如对此大作业其他细节感兴趣或想知道大作业所有内容可联系我本人进行交流(联系方式可见首页封面头像下方)


星星温柔泛滥,人间至善