python数据结构编程题_生信编程实战第5题(python)
image.png
先从hg38的gtf中提取"ANXA1"基因grep '"ANXA1"' hg38.gtf >ANXA1.gtf
在题目之前先分析要处理的数据的结构是什么样的以及要做什么
1.数据结构是怎么样的:
image.png
以gene开头,对应唯一的gene name
接下来是transcript 有唯一的transcript name
transcript下面的包括exon,CDS,start codon,stop codon,three_prime_utr,five_prime_utr都是属于transcript,都会对应有相同的transcript name
有的exon包括5'端的UTR区域或者3'端的UTR区域
而对于不包括UTR的exon就称之为CDS,所以CDS并不等同于exon
所以问题就很清楚了
2.要做什么:
如果要统计gene坐标:
则以gene name 为key建立gene的字典,方法是先构建dict_gene={},然后直接把坐标存到dict_gene[gene_name]=[,]列表中储存坐标
如果要统计exon坐标:
则以gene name 为key建立exon的字典,然后字典中又以不同的transcript name 作为key建立字典,方法是先构建dict_exon[gene_name]={},然后根据找到的transcript name,把transcript name作为key再存入,即dict_exon[gene_name][transcript_name]=[],把transcript对应的exon坐标存到列表中。
如果要统计UTR坐标:
同理;
image.png
image.png
python实现的代码如下import collectionsimport matplotlibimport matplotlib.pyplot as pltimport matplotlib.ticker as tickerimport matplotlib.patches as patches
matplotlib.style.use("ggplot")
gene_cord=collections.OrderedDict()
gene_exon=collections.OrderedDict()
gene_utr=collections.OrderedDict()
gene_start_codon=collections.OrderedDict()
gene_stop_codon=collections.OrderedDict()with open ("ANXA1.gtf") as fh: for line in fh:
lineL=line.strip().split("\t") if lineL[2]=="gene":
gene_info=lineL[-1]
gene_infoL=gene_info.split("; ")
gene_name=gene_infoL[2]
gene_nameL=gene_name.split(" ")
gene_name=eval(gene_nameL[1])
gene_cord[gene_name]=[int(lineL[3]),int(lineL[4])] #对基因构建字典,key是基因名,value是基因坐标
gene_exon[gene_name]={}
gene_utr[gene_name]={} elif lineL[2]=="transcript":
trans_info=lineL[-1]
trans_infoL=trans_info.split("; ")
trans_name=trans_infoL[9]
trans_nameL=trans_name.split(" ")
trans_name=eval(trans_nameL[1])
gene_exon[gene_name][trans_name]=[] #字典中套字典,最终的value先建立为空list
gene_exon[gene_name][trans_name].append(lineL[6]) #往空list中添加正负链信息的元素
gene_utr[gene_name][trans_name]=[] elif lineL[2]=="exon":
gene_exon[gene_name][trans_name].extend([int(lineL[3]),int(lineL[4])]) #往list中加exon坐标
elif lineL[2] in ["five_prime_utr","three_prime_utr"]:
gene_utr[gene_name][trans_name].extend([int(lineL[3]),int(lineL[4])]) #往list中加UTR坐标fig= plt.figure() #建一个画板ax = fig.add_subplot(111) #将画板分为1行1列,图像画在从左到右从上到下第一块trans_num=0for trans_name,exon in gene_exon[gene_name].items():
trans_num+=1
if exon[0]=="+":
col="limegreen"
if exon[0]=="-":
col="magenta"
for i in range(1,len(exon),2): #注意!!!python中for i in range(n,m) 范围包括n,不包括m
#对每个exon画矩形图
#ax.add_patch(patches.Rectangle((x,y),width,height))
rect=patches.Rectangle((exon[i],trans_num-0.1),exon[i+1]-exon[i],0.2,color=col,fill=True)
ax.add_patch(rect) #对每个intron画线图
if i
ax.plot([exon[i+1],exon[i+2]],[trans_num,trans_num],color="red",linewidth="0.5")#对UTR画图 trans_num=0for trans_name,utr in gene_utr[gene_name].items():
trans_num+=1
if utr==[]: continue
else: for i in range(0,len(utr),2):
rect=patches.Rectangle((utr[i],trans_num-0.1),utr[i+1]-utr[i],0.2,color="black")
ax.add_patch(rect)
ax.set_xlabel(gene_name,color="blue",fontsize=14,fontweight="bold")
ax.yaxis.set_major_locator(ticker.FixedLocator(range(1,trans_num+1)))
ax.set_yticklabels(gene_exon[gene_name].keys())
plt.xlim(gene_cord[gene_name])
plt.ylim([0.5,trans_num+0.5])
plt.show()
fig.savefig('rect.png', dpi=90, bbox_inches='tight')
几个注意的点:
1.list中增加元素的方法大概有两种方式:
第一种是list.append
另一种是list.expend
区别在于第一种是直接把整个模块加入list中,第二种是将元素一个个添加到list中
举个例子:B = ['q', 'w', 'e', 'r']
B.append(['t', 'y'])
B
['q', 'w', 'e', 'r', ['t', 'y']]
A = ['q', 'w', 'e', 'r']
A.extend(['t', 'y'])
A
['q', 'w', 'e', 'r', 't', 'y']
我希望把exon和UTR坐标存到list中是当成每个元素去存的,方便后续处理 所以用的是extend
而trans_name是单个的,直接用append就好
2.for i in range(m,n,k),范围包括m,不包括n
作者:天秤座的机器狗
链接:https://www.jianshu.com/p/abb29ce1f76d
python数据结构编程题_生信编程实战第5题(python)相关推荐
- python3编程实战_生信编程实战第3题(python)
image.png wget ftp://ftp.ensembl.org/pub/release-87/gtf/homo_sapiens/Homo_sapiens.GRCh38.87.chr.gtf. ...
- python3.7程序实例_生信编程实战第7题(python)
image.png 做这个题目之间必须要了解一些背景知识 1.超几何分布 超几何分布是统计学上一种离散概率分布.它描述了由有限个物件中抽出n个物件,成功抽出指定种类的物件的次数(不归还),称为超几何分 ...
- 引用另一模板的宏_生信人值得拥有的编程模板Shell
前言 "工欲善其事必先利其器",生信工程师每天写代码.搭流程,而且要使用至少三门编程语言,没有个好集成开发环境(IDE,Integrated Development Environ ...
- 编程心得体会_生信编程语言的经验之谈
对于生信狗来说,日常的数据分析任务大概可以分成三大类: 纯文本处理 数值计算 图表可视化 其中,对这几个任务的可选的解决方案,以及各自的最优解决方案分别为: 纯文本处理: Linux下的文本处理命令, ...
- python生信编程1-5
文章目录 Counting DNA Nucleotides/统计ATCG数 Problem Sample Dataset Sample Output Transcribing DNA into RNA ...
- python代码没有反应_没有任何编程经验者不要被Python简明手册误导。
想学python,没有任何编程经验者不要被python简明手册误导. 1.python简明手册是一本好书 但这本书是针对有经验的程序员看的,详细一点说,有3年以上c++/java,.delphi/vb ...
- 扇贝python编程课_【扇贝编程python安卓手机下载】扇贝编程app v1.1.47 破解版-趣致软件园...
扇贝编程python是运行于安卓平台的一款专业Python课程学习应用,该应用内置了专业强大的教研团队与交互式学习方法,同时还能够支持电脑.手机进度同步,自动保存学习进度,让用户能够使用扇贝编程轻松精 ...
- python完全支持面向对象编程思想_面向对象的编程思想和Python的类,访问和属性,继承...
本文将从访问限制,属性,继承,方法重写这几个方面继续介绍面向对象的编程思想和Python类的继承. 复制代码 一.访问权限: Python中在类的内部定义属性和方法,在类的外部是可以直接调用或进行访问 ...
- 手机可以python编程吗_可以使用手机编程实现python吗
这里介绍2个在可以在手机上编程Python的软件,一个是QPython3,一个是Termux,其中QPython3集成了Python3解释器,可以直接编写运行Python程序,Termux类似于一个手 ...
最新文章
- 深度学习Deep Learning 相关库简介
- 什么是 Silverlight?
- 优化理论08-----约束优化的最优性条件、拉格朗日条件、凸性、约束规范、二阶最优性条件(上)
- 灵敏度和稳定性能兼具 新气体传感器技术适用于工业应用
- mysql日期函数大全_MYSQL教程mysql日期时间函数大全 mysql函数大全
- Java中使用正则表达式
- 怎么注册tk域名_.TK后缀顶级域名的免费注册图文教程
- 印刷MES管理系统等数字化系统,应用发展如此迅速
- 输入关键词获取今日头条免费图片
- iOS开发——cache自动清理方案探索
- mysql介绍索引类型的章节_mysql索引总结--mysql索引类型以及创建的详细介绍
- 石墨笔记,熊掌记和 Effie 哪个更适合 SMZDM 开箱评论者?
- html5游戏 很费流量嘛,2017TFC5玩游戏林勇坤 优化HTML5游戏流量数据转化
- git(9)Git 内部原理
- K60系列学习(一)
- Linux网络管理—brctl命令
- c语言项目开发全程实录视频,C语言项目开发全程实录(第2版)(软件项目开发全程实录)简介,目录书摘...
- 修改app应用程序图标
- 933计算机大纲,2020年华南理工大学933化学综合考研大纲
- 让人叹为观止的蛋壳艺术