2015-04-23 3 views
1

Я хотел бы создать многоуровневый стиль perl в python, но я изо всех сил стараюсь это сделать.Многоуровневый словарь в 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, поэтому я утверждаю, если это глупый вопрос. Я могу сделать это в 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

Я не знаком с жемчугом, но в питоне вам нужно начать словарь перед вызовом конкретной записи. Как вы используете 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, который обеспечивает эту структуру:

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 

Вы можете преобразовать их обратно в dicts с помощью:

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 
     } 
    } 
} 
Смежные вопросы