我想在python中创建一个perl风格的多级dict但是我很难实现这个目标。
这就是我的尝试:
import sys
import csv
import pprint
from collections import defaultdict
hash = defaultdict(dict)
FILE = csv.reader(open('dosageMP.txt', 'rU'), delimiter='\t')
FILE.next()
count = 0
for row in FILE:
if count < 10:
print row
hash[row[0]][row[10]][row[5]] = 1
count = count+1
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(hash)
此代码似乎适用于两个级别hash[row[0]][row[10]]
,但不会在3或4级别上工作。
任何帮助都会非常感激,我是python的新手,所以如果这是一个愚蠢的问题我会批评。我可以在perl中完成,但不能在python中完成。
我想要的输出是:
Center->ROOM1->EXAM1
->EXAM2
ROOM2->EXAM1
->EXAM2
->EXAM3
Center2->ROOM3->EXAM1
答案 0 :(得分:2)
您实际上正在寻找树状结构。有一个simply Python function提供了这种结构:
from collections import defaultdict
def tree():
return defaultdict(tree)
现在您可以按如下方式进行设置:
hash = tree()
hash['Center']['ROOM1']['EXAM1'] = 1
hash['Center']['ROOM1']['EXAM2'] = 2
hash['Center']['ROOM2']['EXAM1'] = 3
hash['Center']['ROOM2']['EXAM2'] = 4
hash['Center']['ROOM2']['EXAM3'] = 5
hash['Center2']['ROOM3']['EXAM1'] = 6
您可以使用以下方法将这些转换回dicts:
def dicts(tree):
return {key: (dicts(tree[key]) if hasattr(tree[key], 'items') else tree[key]) for key in tree}
例如,这里是上面hash
变量的美化输出:
>>> import json
>>> print json.dumps(dicts(hash), indent=4)
{
"Center2": {
"ROOM3": {
"EXAM1": 6
}
},
"Center": {
"ROOM2": {
"EXAM2": 4,
"EXAM3": 5,
"EXAM1": 3
},
"ROOM1": {
"EXAM2": 2,
"EXAM1": 1
}
}
}
答案 1 :(得分:0)
我不熟悉pearl,但是在python中你需要在调用特定条目之前启动一个字典。你使用defaultdict的方式,你创建一个只有两层深度的结构。
如果你真的不需要defaultdict功能,那么这不是那么优雅,而是快速的方式来做你想要的。
import sys
import csv
import pprint
hash = {}
FILE = csv.reader(open('dosageMP.txt', 'rU'), delimiter='\t')
FILE.next()
count =0
for row in FILE:
if count <10:
print row
hash[row[0]]={}
hash[row[0]][row[10]]={}
hash[row[0]][row[10]][row[5]]=1
count = count+1
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(hash)
我也不熟悉pprint,但我希望它可以处理这个结构。