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