2015-04-23 113 views
1

我想在python中创建一个perl样式的多级字典,但是我正努力实现这一目标。Python中的多级字典

这是我曾尝试:

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,所以我appologies,如果这是愚蠢的问题。我可以在Perl中完成,但不能在Python中完成。

我想输出是:

Center->ROOM1->EXAM1 
       ->EXAM2 
     ROOM2->EXAM1 
       ->EXAM2 
       ->EXAM3 
Center2->ROOM3->EXAM1 
+1

你在'ROOM_X_'列表或字典下使用了什么数据结构? “dosageMP.txt”里面的数据结构又是什么? – wanderlust

+0

逻辑应该是相同的,无论是Perl还是Python。你用Perl来嘲笑它吗? –

+0

作为一个方面说明:你不应该使用'count'这样的变量。请改用'enumerate()'。 https://docs.python.org/2/library/functions.html#enumerate – felixbr

回答

0

我不熟悉的珍珠,但在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,但我希望它能处理这个结构。

2

你实际上是在寻找一个树形结构。有一个simply Python function提供这样的结构:

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 

您可以通过将这些回类型的字典:

from collections import defaultdict 
def tree(): 
    return defaultdict(tree) 

现在你可以如下设置

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