Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';在python中,将k-mers加载到dict中最有效的方法是什么?_Python_Dictionary_Bioinformatics - Fatal编程技术网

什么';在python中,将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” 然而,我发现对

目前,我有数百个细菌基因组(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”

然而,我发现对于我自己的代码来说,它的效率还不够(见下文)。。。有没有更有效的方法来实现这一目标

    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相同的索引范围)。谢谢