On Thu, 01 Jan 2009 11:04:42 -0500
"Keith Reed" <keith_r...@fastmail.net> wrote:

> I'm having trouble assigning a dictionary as a value within another:
> 
> 
> -------- Code Snippet Start --------
> 
>         for line in fromchild.readlines():
>                 itemarray = line.strip().split(":")
>                 parentdictkey = itemarray[0]
>                 print 'parentdictkey = ' + parentdictkey
>                 for index in range(len(headerinfo)):
>                         nesteddict[headerinfo[index]] = itemarray[index]
>                 #print nesteddict
>                 parentdict[parentdictkey] = nesteddict
>                 nesteddict.clear()
>         print
>         
> '-------------------------------------------------------------------------\n'
>         print parentdict
> 
> -------- Code Snippet End --------
> 
> -------- Output Start --------
> {'24': {}, '25': {}, '26': {}, '27': {}, '20': {}, '21': {}, '22': {},
> '23': {}, '28': {}, '29': {}, '1': {}, '0': {}, '3': {}, '2': {}, '5':
> {}, '4': {}, '7': {}, '6': {}, '9': {}, '8': {}, '11': {}, '10': {},
> '13': {}, '12': {}, '15': {}, '14': {}, '17': {}, '16': {}, '19': {},
> '18': {}, '31': {}, '30': {}}
> -------- Output End --------

Some notes about the code.
-1- 'itemarray' actually is a list of data items, right? So why not simply call 
it 'items'?

-2- It seems that 'headerinfo' is a constant list of data field names, that 
will become (nested)
dict keys. If it really is constant, I would thus call it 'KEYS', else 'keys' 
if it is as computed
value instead (e.g. read from a file/table header).

-3- As headerinfo/keys is constant /inside the dict filling loop/ anyway, you 
can use nice
built-in functions enumerate() or zip() to make the code much clearer. Below 
how they work/

-4- 'parentdictkey' is a rather misleading name as I understand it -- isn't it 
the key of the
current nested dict instead?

=========================================
keys = ("un","du","tri")
items= ("foo","bar","blah")

d=dict()
for index,key in enumerate(keys):       # --> (index,item) tuples
        d[key]=items[index]
print d

d.clear()
for key,item in zip(keys,items):        # --> (key,item) tuples
        d[key]=item
print d
==>
{'tri': 'blah', 'du': 'bar', 'un': 'foo'}
{'tri': 'blah', 'du': 'bar', 'un': 'foo'}
=========================================

So that your nested dict filling loop may change:
        for index in range(len(headerinfo)):
                nesteddict[headerinfo[index]] = itemarray[index]
        for key,item in zip(keys,items):
                nesteddict[key] = item

> The key looks correct below (it's a unique ID), but the dictionary
> inserted below is empty.
> If I uncomment the print statement above, the nesteddict dictionary
> displays all the proper keys and values. So I know it's getting filled
> OK, but it doesn't insert into the parent dictionary at all in the line:
> parentdict[parentdictkey] = nesteddict
> 
> Any thoughts on how to properly insert the nested dictionary so that I
> can refer to it?
> 

The point (always again biting python users) is that you have created a single 
nesteddict object.
And: Python variables simply are name:object bindings -- which is right. So 
that at the end of
your routine, you have a single nesteddict which happens to be empty because 
you clear it. All
parentdict[parentdictkey] references point to a unique object, actually an 
empty dictionay.
The right thing to do is to create a brand new dict at start of each loop -- 
which by the way is
fully consistent because you really n sub-dictionaries:
        for line in fromchild.readlines():
                nested_dict = dict()    # new empty sub-dict
Then you do not need the final clear()ing anymore.

Denis
------
la vida e estranya
_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor

Reply via email to