我可以在Python中将defaultdict或dict转换为ordereddict吗?

时间:2015-11-30 08:11:38

标签: python bioinformatics biopython fasta defaultdict

我正在尝试解析一个fasta文件,然后我想创建另一个文件,其中包含fasta文件的所有可能的第100个ATGCN序列。

例如:

chr1_1-100:ATGC.....GC  
chr1_2-101:ATGC.....GC  
chr1_3-102:ATGC.....GC  
......................  
chr22_1-100:ATGC....cG  
chr22_2-101:ATGC....cG  
......................

我使用以下代码完成了它:

    from Bio import SeqIO
    from Bio.Seq import Seq
    from Bio.SeqRecord import SeqRecord
    records = SeqIO.to_dict(SeqIO.parse(open(i1), 'fasta'))
    with open(out, 'w') as f:
       for key in records:
     long_seq_record = records[key]
     long_seq = long_seq_record.seq
     length=len(long_seq)
     alphabet = long_seq.alphabet
     for i in range(0, length-99):  
         short_seq = str(long_seq)[i:i+100]
         text="@"+key+"_"+str(i)+"-"+str(i+100)+":"+"\n"+short_seq+"\n"+"+"+"\n"+"IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII\n"
     f.write(text)

问题是写入的文件没有被排序。它首先可以包含chr10然后chr2

问题出现了,因为解析是使用dict(完成的,例如SeqIO.to_dict(SeqIO.parse(open(i1), 'fasta'))

那么,我可以将dict转换为有序的dict,以便我的文件有序吗?或者还有其他方法可以获得解决方案吗?

3 个答案:

答案 0 :(得分:0)

  

我可以在Python中将defaultdict或dict转换为ordereddict吗?

是的,您可以将其转换为OrderedDict(any_dict),如果您需要订购密钥,则可以在创建OrderedDict之前对其进行排序:

>>> from collections import OrderedDict
>>> d = {'c':'c', 'b':'b', 'a':'a'}
>>> o = OrderedDict((key, d[key]) for key in sorted(d))
>>> o.items()[0]
('a', 'a')
>>> o.items()[1]
('b', 'b')
>>> o.items()[2]
('c', 'c')

答案 1 :(得分:0)

根本不打算制作任何类型的词典。你不需要dict给你的属性,你需要dict转换丢失的信息。来自SeqIO.parse的记录迭代器已经为您提供了所需内容:

with open(i1) as infile, open(out, 'w') as f:
    for record in SeqIO.parse(infile, 'fasta'):
        # Do what you were going to do with the record.

如果您需要dict键中的信息,那就是record.id

答案 2 :(得分:0)

您已正确识别问题的原因:to_dict方法返回一个dict,表示订单已丢失。从那时起,就无法恢复订单。

更多,你并没有真正使用dict,因为你按顺序处理所有内容,所以你可以迭代:

for record in SeqIO.parse(open(i1), 'fasta')) :
    key = record.id
    long_seq = record.seq
    ...