views:

462

answers:

5

I have a case where I need to construct following structure programmatically (yes I am aware of .setdefault and defaultdict but I can not get what I want)

I basically need a dictionary, with a dictionary of dictionaries created within the loop. At the beginning the structure is completely blank.

structure sample (please note, I want to create an array that has this structure in the code!)

RULE = {
     'hard_failure': {
        4514 : {
           'f_expr' = 'ABC',
           'c_expr' = 'XF0',
     }
    }
   }

pseudo code that needs to create this:

...
self.rules = {}
for row in rows:
     a = 'hard_failure'
     b = row[0] # 4514
     c = row[1] # ABC
     d = row[2] # XF0
     # Universe collapse right after
     self.rules = ????
...

The code above is obviously not working since I dont know how to do it!

+1  A: 

Example, that you've posted is not a valid python code, I could only imagine that you're trying to do something like this:

self.rules[a] = [{b:{'f_expr': c, 'c_expr': d}}]

this way self.rules is a dictionary of a list of a dictionary of a dictionary. I bet there is more sane way to do this.

SilentGhost
A: 

Your example code doesn't seem to be valid Python. It's not clear if the second level element is supposed to be a list or a dictionary.

However, if you're doing what I think you're doing, and it's a dictionary, you could use a tuple as a key in the top-level dictionary instead of nesting dictionaries:

>>> a = 'hard_failure'
>>> b = 4514
>>> c = "ABC"
>>> d = "XF0"
>>> rules = {}
>>> rules[(a,b)] = {'f_expr' : a,'c_expr' : d}
>>> rules
{('hard_failure', 4514): {'c_expr': 'XF0', 'f_expr': 'hard_failure'}}
Dave Webb
+1  A: 

My favorite way to deal with nested dictionaries & lists of dictionaries is to use PyYAML. See this response for details.

Pete
A: 
rules = {}
failure = 'hard_failure'
rules[failure] = []
for row in rows:
  #this is what people are referring to below.  You left out the addition of the    dictionary structure to the list.
  rules[failure][row[0]] = {} 
  rules[failure][row[0]]['type 1'] = row[1]
  rules[failure][row[0]]['type 2'] = row[2]

This is what I created based on how I understood the questions. I wasn't sure what to call the 'f_expr' and 'c_expr' since you never mention where you get those but I assume they are already know column names in a resultset or structure of some sort.

Just keep adding to the structure as you go.

Arthur Thomas
A: 

Well, I apologize for the confusion, I never claimed that code actually compiled, hence (pseudo). Arthur Thomas put me on the right track, here is slightly modified version. (Yes, now its a simply nested dictionary, 3 levels down)

    RULE_k = 'hard_failure'
    self.rules = {}
    for row in rows:
           self.rules_compiled.setdefault(RULE_k, {})
           self.rules_compiled[RULE_k][row[1]] = {}
           self.rules_compiled[RULE_k][row[1]]['f_expr'] = row[0]
           self.rules_compiled[RULE_k][row[1]]['c_expr'] = row[1]
Terry Felkrow
Correct way to handle this on Stack Overflow is to edit your question to clarify the whole thing, rather than putting in an "answer" that may not be an answer. If this is really an answer, then accept it by clicking on the checkmark icon to the left. Otherwise people coming here later haven't got a clue what you're up to.
Peter Hansen