簡體   English   中英

如何使用python從文件創建多級字典

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

我試圖從文件創建一個多級字典。

文件格式類似於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    +

字典數據結構如下。

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

需要幫助

您可以使用嵌套的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))

輸出:

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

以上僅適用於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