如何使用python从文件创建多级字典

如何使用python从文件创建多级字典,python,Python,我正在尝试从一个文件创建一个多级字典 文件格式如下:file.txt name1 gene1 cds 1 2 + name1 gene1 cds 2 5 - name1 gene1 exon 1 2 + name1 gene1 exon 2 5 - name1 gene2 cds 4 6 + name1

我正在尝试从一个文件创建一个多级字典

文件格式如下:file.txt

name1   gene1   cds     1       2       +
name1   gene1   cds     2       5       -
name1   gene1   exon    1       2       +
name1   gene1   exon    2       5       -
name1   gene2   cds     4       6       +
name1   gene2   cds     6       9       +
name1   gene2   exon    1       10      +
name1   gene2   exon    2       5       -
name2   gene1   gene    1000    1333    +
字典数据结构如下所示

dct =  { 'name1' : {'gene1':{'cds':[[1, 2, '+'],[2, 5, '-']], "exon": [[1, 2, '+'],[2, 5, '-']] } , 'gene2':{'cds':[[4, 6, '+'],[6, 9, '+']], "exon": [[1, 10, '+'],[2, 5, '-']] } } }
或者只是为了理解:

name1
        gene1
                exon
                        1, 2, "+",
                        2, 5, "-"
                CDS
                        1, 2, "+"
                        2, 5, "-"
        gene2
                CDS
                        4, 6 "+"
                        6, 9, "+" 
                exon
                        1, 10, "+",
                        2, 5, "-"
name2 
...
...
我的尝试:

import re

def read_dct(name):
        filename = name
        dct = {}
        ReadFH = open(filename, 'r')
        for i, line in enumerate(ReadFH):
                line = line.rstrip()
                tmp=re.split(r'\t', line)
                if(len(tmp) > 5):
                        dct[tmp[0]][tmp[1]][tmp2]=[tmp[3], tmp[4], tmp[5]]

        ReadFH.close
        return dct

filename = "file.txt"
dct = read_dct(filename)
print dct
创建词典时遇到问题:

dct[tmp[0]][tmp[1]][tmp2]=[tmp[3], tmp[4], tmp[5]]
需要此方面的帮助

您可以使用嵌套,其中第三级的值是列表:

from collections import defaultdict

res = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))

with open('test.txt') as f:
    for line in f:
        k1, k2, k3, *val = line.split()
        res[k1][k2][k3].append(val)

for k, v in res.items():
    for k2, v2 in v.items():
        for k3, v3 in v2.items():
            print('{}, {}, {}: {}'.format(k, k2, k3, v3))
输出:

name2, gene1, gene: [['1000', '1333', '+']]
name1, gene2, cds: [['4', '6', '+'], ['6', '9', '+']]
name1, gene2, exon: [['1', '10', '+'], ['2', '5', '-']
name1, gene1, cds: [['1', '2', '+'], ['2', '5', '-']]
name1, gene1, exon: [['1', '2', '+'], ['2', '5', '-']]
以上仅适用于Python3,因为Python2不支持。在Python 2上,您可以存储由
split
返回的
列表
,并使用slice获取键和值:

with open('test.txt') as f:
    for line in f:
        l = line.split()
        k1, k2, k3 = l[:3]
        res[k1][k2][k3].append(l[3:])

是否保证每个
外显子
CD
将有两套三件事?否,它们可能有多套三件事删除了我的答案,因为在修复错误后,它将与您的答案相同。不过,可能会将链接添加到中。@tobias_k感谢您提供的链接,并将其添加到了答案中。此外,我建议将“以上仅适用于…”更改为“此和此仅适用于…”,因为该方法的其余部分,尤其是嵌套的
defaultdict
,在Python 2中仍然可以正常工作。您只需使用
k1、k2、k3、k4、k5、k6=…
,或者根本不解包。