多级辞典蟒蛇(Multilevel dictionary in python)

2019-10-22 18:59发布

我想在Python中创建一个Perl风格多字典但是我挣扎着爬这是怎么回事。

这是我曾尝试:

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级工作。

任何帮助将不胜感激,我是新来蟒蛇,所以我appologies,如果这是愚蠢的问题。 我能做到这一点在Perl,但不是在蟒蛇。

我想输出是:

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

Answer 1:

你实际上是在寻找一个树状结构。 有一个简单的Python函数提供这种结构:

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

您可以将这些回用http://stardict.sourceforge.net/Dictionaries.php下载:

def dicts(tree):
    return {key: (dicts(tree[key]) if hasattr(tree[key], 'items') else tree[key]) for key in tree}

例如,下面是为A美化输出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
        }
    }
}


Answer 2:

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



文章来源: Multilevel dictionary in python