python - python中的多级字典

标签 python perl dictionary hash

我想在 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 级。

任何帮助将不胜感激,我是Python新手,所以如果这是一个愚蠢的问题,我表示歉意。我可以在 perl 中完成,但不能在 python 中完成。

我想要的输出是:

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

最佳答案

您实际上正在寻找树结构。有一个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

您可以使用以下方法将它们转换回字典:

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

关于python - python中的多级字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29823338/

相关文章:

python - 使用 BlueZ 5 模拟键盘

python - BioPython:从 Blast 输出文件中提取序列 ID

python - Kivy在第一次调用play()时不会播放声音文件

c# - 为这种情况寻找合适的数据结构(最好是字典和列表)

dictionary - golang - 如何在结构中初始化映射字段?

python - 为什么这段 Python 代码可以正常工作?请解释

regex - 如何根据真实数据自动创建模式?

perl - 为什么打印时哈希键的顺序不同?

perl - 如何在附加的sqlite数据库中创建外键?

Python - 从数据行中提取字段名称并重新格式化