如何使用python从文件创建多级字典
我正在尝试从一个文件创建一个多级字典 文件格式如下:file.txt如何使用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
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=…
,或者根本不解包。