简体   繁体   English

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

[英]How to create multilevel dictionary from a file using python

I am trying to create a multilevel dictionary from a file. 我试图从文件创建一个多级字典。

The file format is like bellow: file.txt 文件格式类似于bellow: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    +

Dictionary data structure is like bellow. 字典数据结构如下。

dct =  { 'name1' : {'gene1':{'cds':[[1, 2, '+'],[2, 5, '-']], "exon": [[1, 2, '+'],[2, 5, '-']] } , 'gene2':{'cds':[[4, 6, '+'],[6, 9, '+']], "exon": [[1, 10, '+'],[2, 5, '-']] } } }

or simply for understanding: 或仅仅是为了理解:

name1
        gene1
                exon
                        1, 2, "+",
                        2, 5, "-"
                CDS
                        1, 2, "+"
                        2, 5, "-"
        gene2
                CDS
                        4, 6 "+"
                        6, 9, "+" 
                exon
                        1, 10, "+",
                        2, 5, "-"
name2 
...
...

My try : 我的尝试:

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

I am getting problem while creating the dictionary : 我在创建字典时遇到问题:

dct[tmp[0]][tmp[1]][tmp2]=[tmp[3], tmp[4], tmp[5]]

Need help on this 需要帮助

You can use nested defaultdict where values on third level are lists: 您可以使用嵌套的defaultdict ,其中第三级的值是列表:

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))

Output: 输出:

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', '-']]

Above only works on Python 3 since extended iterable unpacking is not supported on Python 2. On Python 2 you can store the list returned by split and use slice to get the keys & value: 以上仅适用于Python 3,因为Python 2不支持扩展的可迭代解包 。在Python 2上,您可以存储split返回的list并使用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:])

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM