簡體   English   中英

python中的多層字典

[英]Multilevel dictionary in python

我想在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函數提供以下結構:

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

我不熟悉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,但希望它能處理這種結構。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM