Building and Transvering multi-level dictionaries

Eric Hagemann ehagemann at home.com
Mon Mar 20 20:51:30 EST 2000


Lee,
    I have been doing somewhat of the same recently. Yours is the first note
I have seen that talks about pushing the dictionary into multi-dimensions.

I was actualy out to replicate the ability of multi-dimensional hashs found
in Perl.
There are a few references to being able to do this but they were static
examples.  I needed the capability to generate multidimensional dictionaries
on the fly.

Here is what I have come up with.

#create empty dictionary
D={}

#add a key and setup for a sub-dictionary
if(D.has_key('a') == 0)
    D['a'] = {}

#add a sub-level to the dictionary
if((D['a']).has_key('b') == 0)
    D['a']['b'] = {}

When you get to the lowest level stop adding dictionaries and store your
value.
To get keys at the different levels use parens

RootKeys = D.keys()
firstlevelKeys = (D['a']).keys()
........

Let me know if you have abetter way of doing this.  I would like to
eliminate the 'if' statement (its not needed in Perl!)
when adding a new sub-dictionary
Cheers
eric


"Lee Joramo" <ljoramo at nickads.com> wrote in message
news:200320001753125356%ljoramo at nickads.com...
> I am trying to build a multi-level dictionary from an text file, and
> then transverse the dictionary, create formated output. I have been
> able to do this for a special case where ever piece of data has a fixed
> number of levels (sub-catagories). However, I am looking for an method
> that can elegantly handel a dictionary with variable depth.
>
> For example, say that I have a file sample.dat with the line format:
>
> catagory:sub:sub TAB description
>
> ---start sample.dat----
> animal:mammal:dog             A very lazy dog
> animal:mammal:dog             Super hunting dog
> animal:mammal:dog             Not your average hound
> animal:mammal:cat             Enjoys sleeping in the sun
> animal:snake                  Beware of the python in the forest
> animal:fish                   There are many fish in the deep blue sea
> animal:fish                   Tuna terrorize the oceans
> plant:tree:evergreen:redwood  Very Very Very Tall
> ---end sample.dat---
>
> The first part of each line is the items classification. The number of
> sub-catagories is variable.
>
> From this file I want to generate a python dictionary:
>
> {'animal' : {'mammal' : {'dog' : ('A very lazy dog', 'Super hunting
> dog', 'Not your average hound'), 'cat' : 'Enjoys sleeping in the sun'},
> 'snake' : 'Beware of the python in the forest', 'fish' : ('There are
> many fish in the deep blue sea', 'Tuna terrorize the oceans')},'tree' :
> {'evergreen' : {'redwood' : 'Very Very Very Tall'}}}
>
>
> Then I want to be able to transvers the dictionary and print an outline:
>
> animal
>    mammal
>      dog
>        * A very lazy dog
>        * Super hunting dog
>        * Not your average hound
>      cat
>        * Enjoys sleeping in the sun
>      snake
>        * Beware of the python in the forest
>      fish
>        * There are many fish in the deep blue sea
>        * Tuna terrorize the oceans
> tree
>    evergreen
>      redwood
>        * Very Very Very Tall
>
> Another point that I am interested in is how get a the value of a
> specific key in an easy way. For example, I know that I can get the
> value of 'cat':
>
> description = mydict['animal']['mammal']['cat']
>
> which in my example returns: 'Enjoys sleeping in the sun'
>
> However I am looking for a way of doing something like list:
>
> compoundkey = 'animal.mammal.cat'
> description = mydict[compoundkey]
>
> Thanks for any suggestions.
>
> --
> --
> Lee A. Joramo                      ljoramo at nickads.com
> The Nickel Want Ads                www.nickads.com
> Internet Manager                   970-242-5555





More information about the Python-list mailing list