我需要将文本文件转换为物种和基因片段的数量。为此我想创建一个字典,用我用模式搜索的键填充。每个键应该有3个项目(数字)从0开始。使用另一个模式,我想查找基因片段,如果有,我想增加计数。
我正在搜索3个不同的基因片段,为什么我只想增加item1
,item2
或item3
。有没有办法用python做到这一点?
这是我现在写的代码,但我不知道如何继续。
matrix = {}
pattern = re.compile(r"[A-Za-z ]*")
pattern_v = re.compile(r";[A_Z]+V[0-9]?;")
pattern_d = re.compile(r";[A_Z]+D[0-9]?;")
pattern_j = re.compile(r";[A_Z]+J[0-9]?;")
for i in file.readlines():
name = pattern.search(i)
if pattern_v.search:
if name.group() not in matrix:
matrix.update(name.group(), (1,0,0))
else:
matrix[(name.group()[0]] = matrix[(name.group()[0]]+1
...
如您所见,如果找到pattern_v
,我想在零位置增加该项目。
我知道,最后一个命令不起作用,我只是写它来解释,我想做什么。
编辑添加:我的算法正常运行,但现在我遇到了问题,我无法按照自己的意愿打印它。
{' Mus cookii':[0,0,0],' Ovis aries':[0,7,9],' Camelus dromedarius': [2,0,0],' Danio rerio':[1,1,5],' Mus saxicola':[0,0,0],' Homo sapiens& #39;:[21,6,33],' Rattus norvegicus':[0,1,12],' Sus scrofa':[0,5,13],&# 39; Vicugna pacos':[0,9,7],' Macaca nemestrina':[0,0,0],' Mus spretus':[4,0,2 ],' Mus musculus':[30,5,28],' Mus minutoides':[0,0,0],' Oncorhynchus mykiss':[0 ,11,16],' Canis lupus familiaris':[4,2,0],' Bos taurus':[2,5,12],' Cercocebus atys&# 39;:[0,0,0],' Oryctolagus cuniculus':[0,0,10],' Rattus rattus':[0,0,0],&#39 ; Ornithorhynchus anatinus':[0,4,9],' Macaca mulatta':[1,3,16],' Papio anubis anubis':[0,0,0 ],' Macaca fascicularis':[0,0,0],' Mus pahari':[0,0,0]}
是输出,但我需要让它更舒适阅读。我们的想法是使用列(名称,v,d,j)创建输出。我试过了:
def printStatistics(dict):
for i in range(0,len(dict)):
print(" {0:30s}{1:30d}{2:30d}{3:30d}".format(dict[i],dict[i] [0],dict[i][1],dict[i][2]), sep = "")
但是我得到了
" TypeError:传递给object的非空格式字符串。格式"
答案 0 :(得分:0)
import re
from collections import defaultdict
import numpy as np
data= '''Bos taurus;TRGV8-1;F;Bos taurus T cell receptor gamma variable 8-1;1;4;4q3.1;AY644517;-;
Bos taurus;TRGV8-2;(F) F;Bos taurus T cell receptor gamma variable 8-2;2;4;4q3.1;AY644517;-;
Camelus dromedarius;TRDV1S3;F;Camelus dromedarius T cell receptor delta variable 1S3;1;-;-;FN298223;-;
Camelus dromedarius;TRDV1S4;F;Camelus dromedarius T cell receptor delta variable 1S4;2;-;-;FN298224;-;
Canis lupus familiaris;TRBD2;F;Canis lupus familiaris T cell receptor beta diversity 2;1;16;-;HE653929;-;'''
patterns = [
re.compile(r"TR.V"),
re.compile(r"TR.D"),
re.compile(r"TR.J")
]
result = defaultdict(lambda:np.array([0,0,0]))
for line in data.splitlines():
result[line.split(';')[0]]+=np.array([len(pattern.findall(line)) for pattern in patterns])
print(result)
defaultdict(<function <lambda> at 0x7f622f81c140>, {'Camelus dromedarius': array([2, 0, 0]), 'Canis lupus familiaris': array([0, 1, 0]), 'Bos taurus': array([2, 0, 0])})
defaultdict
的工作方式类似于字典,但每个键都是用您选择的可调用语句初始化的。 lambda: [0,0,0]
使您能够立即增加组出现次数,而不必进行更新和增量。
我决定使用numpy数组,因为它们支持向量添加操作,这使得算法更漂亮,你也可以在没有numpy的情况下进行操作。
答案 1 :(得分:0)
现在找到一个使用defaultdictionary的解决方案:
def printStatistics(dict):
print(" {0:<30s}{1:<15s}{2:<15s}{3:<15s}".format("Species", "V Count", "D Count", "J Count"), sep = "")
for item in dict:
print(" {0:<30s}{1:<15d}{2:<15d}{3:<15d}".format(item,dict[item][0],dict[item][1],dict[item][2]), sep = "")
<强>印刷强>
{{1}}
Thx 4帮助!