2009-12-11 15 views
2

J'ai un cas où je dois construire la structure suivante programme (oui je suis au courant de .setdefault et defaultdict mais je ne peux pas obtenir ce que je veux)Liste des dictionnaires, dans un dictionnaire - en Python

J'ai fondamentalement besoin d'un dictionnaire, avec un dictionnaire de dictionnaires créé dans la boucle. Au début, la structure est complètement vide.

échantillon de la structure

(s'il vous plaît noter, je veux créer un tableau qui a cette structure dans le code!)

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

pseudo qui doit créer ceci:

... 
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 = ???? 
... 

Le code ci-dessus est évidemment ne fonctionne pas puisque je ne sais pas comment le faire!

+0

votre échantillon n'est pas un python valide – SilentGhost

+1

Essayez d'être plus clair, votre échantillon de la structure n'a pas de sens. Vous ne pouvez pas utiliser la syntaxe 4514: {} entre crochets. –

Répondre

5

exemple, que vous avez posté est pas un code python valide, je ne pouvais imaginer que vous essayez de faire quelque chose comme ceci:

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

cette façon self.rules est un dictionnaire d'une liste de un dictionnaire d'un dictionnaire. Je parie qu'il est plus sain de faire cela.

+0

+1 pour "Je parie qu'il y a plus de sens" – chucksmash

0

Votre exemple de code ne semble pas être valide Python. Il n'est pas clair si l'élément de second niveau est censé être une liste ou un dictionnaire.

Toutefois, si vous faites ce que je pense que vous faites, et il est un dictionnaire, vous pouvez utiliser un tuple comme une clé dans le dictionnaire de haut niveau au lieu de dictionnaires de nidification:

>>> 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'}} 
1
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] 

C'est ce que j'ai créé en fonction de la façon dont j'ai compris les questions. Je ne savais pas trop comment appeler 'f_expr' et 'c_expr' puisque vous ne mentionnez jamais où vous les obtenez, mais je suppose qu'ils connaissent déjà les noms de colonnes dans un ensemble de résultats ou une structure quelconque.

Continuez à ajouter à la structure que vous allez.

0

Eh bien, je m'excuse pour la confusion, je n'ai jamais prétendu que le code était réellement compilé, donc (pseudo). Arthur Thomas m'a mis sur la bonne voie, voici une version légèrement modifiée. (Oui, maintenant son dictionnaire simplement emboîtés, 3 niveaux bas)

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] 
+1

Corriger la façon de gérer cela sur Stack Overflow est d'éditer votre question pour clarifier le tout, plutôt que de mettre une "réponse" qui peut ne pas être une réponse. Si c'est vraiment une réponse, alors acceptez-le en cliquant sur l'icône de coche à gauche. Sinon, les gens qui viennent ici plus tard n'ont pas la moindre idée de ce que vous faites. –

Questions connexes