什么';在python中,将k-mers加载到dict中最有效的方法是什么?
目前,我有数百个细菌基因组(fasta文件),我想解析这些fasta文件,然后将这些文件中的k-mers加载到dict。例如 法斯塔什么';在python中,将k-mers加载到dict中最有效的方法是什么?,python,dictionary,bioinformatics,Python,Dictionary,Bioinformatics,目前,我有数百个细菌基因组(fasta文件),我想解析这些fasta文件,然后将这些文件中的k-mers加载到dict。例如 法斯塔 >1 ATAATA >2 TTTAAA ..... B.法斯塔 >1 ATAAGA >2 TTTAGA ...... 然后,我想要得到的dict如下(假设k=4): d={'ATAA':{'A':'','B':'',…},'TAAA':{'A':'',…},…}A指“A.fasta”,B指“B.fasta” 然而,我发现对
>1
ATAATA
>2
TTTAAA
.....
B.法斯塔
>1
ATAAGA
>2
TTTAGA
......
然后,我想要得到的dict如下(假设k=4):
d={'ATAA':{'A':'','B':'',…},'TAAA':{'A':'',…},…}A指“A.fasta”,B指“B.fasta”
然而,我发现对于我自己的代码来说,它的效率还不够(见下文)。。。有没有更有效的方法来实现这一目标
import re
import os
from Bio import SeqIO
from collections import defaultdict
import sys
sys.path.append('..')
from library import seqpy
def build_kmer_dict(idir,k):
print('Load k-mer to dict...')
dlabel=defaultdict(lambda:{})
c=1
label_match={}
for filename in os.listdir(idir):
ff=idir+'/'+filename
seq_dict = {rec.id : rec.seq for rec in SeqIO.parse(ff, "fasta")}
for cl in seq_dict:
seq=str(seq_dict[cl])
for i in range(len(seq)-k+1):
kmer=seq[i:i+k]
rev_kmer=seqpy.revcomp(seq[i:i+k])
dlabel[kmer][c]=''
dlabel[rev_kmer][c]=''
label_match[c]=filename
c+=1
return dlabel,label_match
# All genomes fasta files are in the folder "../Fasta_File_Dir"
d, lm=build_kmer_dict('../Fasta_File_Dir',31)
基于原始帖子评论的演示代码。一次处理整个反向补码,而不是迭代地处理重叠的片段
import re
import os
from Bio import SeqIO
from collections import defaultdict
import sys
sys.path.append('..')
from library import seqpy
def build_kmer_dict(idir,k):
print('Load k-mer to dict...')
dlabel=defaultdict(lambda:{})
c=1
label_match={}
for filename in os.listdir(idir):
ff=idir+'/'+filename
seq_dict = {rec.id : rec.seq for rec in SeqIO.parse(ff, "fasta")}
for cl in seq_dict:
seq=str(seq_dict[cl])
rev_seq =seqpy.revcomp(seq) # calculate reverse sequence once
for i in range(len(seq)-k+1):
kmer=seq[i:i+k]
#rev_kmer=seqpy.revcomp(seq[i:i+k])
rev_kmer=rev_seq[i:i+k] # assumes that order doesn't matter
dlabel[kmer][c]=''
dlabel[rev_kmer][c]=''
label_match[c]=filename
c+=1
return dlabel,label_match
# All genomes fasta files are in the folder "../Fasta_File_Dir"
d, lm=build_kmer_dict('../Fasta_File_Dir',31)
没有必要为每个kmer运行seqpy.revcomp()。每个序列运行一次该函数。在这种情况下,我需要迭代原始序列和反向序列,我不确定运行时间是否比“为每个kmer运行seqpy.revcomp()”更长或更短。您现在已经有效地做到了这一点。除了计算每个迭代的rev_kmer。如果KMER没有重叠,这不会是一个问题。但如果k=31,重叠为1,则计算出的rev_kmer比需要的多出约x30。您应该能够使用相同的索引,而无需重新迭代。范围很广,秩序也不重要。您可以处理seq forward和rev_seq backwards(相对;使用与seq相同的索引范围)。谢谢