【问题标题】:Multilevel dictionary in pythonpython中的多级字典
【发布时间】:2015-07-01 15:10:32
【问题描述】:

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

【问题讨论】:

标签: python perl dictionary hash


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我不熟悉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 也不熟悉,但我希望它能处理这种结构。

    【讨论】:

      猜你喜欢
      • 2013-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-14
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 2022-12-03
      相关资源
      最近更新 更多