2010-10-12 2 views
3

je veux faire quelque chose comme ceci:façon Pythonic écrire créer le dictionnaire de la compréhension dict, + quelque chose d'autre

parsetable = { 
       # ... 

       declarations: { 
          token: 3 for token in [_id, _if, _while, _lbrace, _println] 
          }.update({_variable: 2}), 

       #... 
      } 

Cependant, cela ne fonctionne pas parce que la mise à jour ne retourne rien. Existe-t-il un moyen facile de faire cela en plus d'écrire explicitement toute la dict?

Il devrait être possible d'utiliser dict() et une compréhension de liste de tuples + la partie supplémentaire, mais cela est gênant.

+0

Pourquoi ces deux instructions ne sont-elles pas? Pourquoi jouez-vous au golf de code? Quel est le problème avec 'parsetable =' et 'parsetable [déclarations] .update()'? –

+1

La dict parsetable complète a déjà une longueur de 70 lignes, et j'aimerais conserver toutes les données associées en un seul endroit pour faciliter la recherche ou le changement. –

+0

"plus facile à chercher ou à modifier"? Comment une affirmation complexe est-elle "plus facile à rechercher ou à modifier"? Si vos programmeurs de maintenance sont des génies, je suppose que le code de golf pourrait être bon. Mais il semble que plus simple est plus précieux pour ceux qui viendront après vous. –

Répondre

4

Je pense que l'approche que vous avez mentionné en utilisant dict() et une liste de tuples est la façon dont je le ferais:

dict([(x, 3) for x in [_id, _if, _while, _lbrace, _println]] + [(_variable, 2)]) 

Si vous voulez vraiment utiliser une compréhension dict que vous pouvez faire quelque chose comme ceci:

{ x : 2 if x == _variable else 3 
    for x in [_id, _if, _while, _lbrace, _println, _variable] } 
+0

Merci pour la réponse. Je pense que la liste dict()/tuple est en fait la façon dont je veux aller. –

1

cependant, juste pour vous faire savoir, si vous voulez mettre à jour retourner somethign, vous pouvez écrire un func comme:

import copy 
def updated_dict(first_dict, second_dict): 
    f = copy.deepcopy(first_dict) 
    f.update(second_dict) 
    return f 
+0

Merci pour la réponse, j'utilise la liste dict()/tuple pour l'instant mais je suis très tenté par les réponses de votre/martineau donc je vais devoir continuer à le considérer. –

1

Je le diviser pour plus de clarté puis appliquer la deuxième suggestion pour une Byers @ Mark compréhension dict:

type2 = [_variable] 
type3 = [_id, _if, _while, _lbrace, _println] 

parsetable = { 
    declarations: { token : 2 if token in type2 else 3 for token in type2+type3 } 
} 

Cela rend les choses très claires et est extensible, tout en gardant les éléments connexes ensemble pour rechercher la facilité et/ou modification.

+1

Je voudrais aussi me débarrasser des nombres magiques harcodés ... – martineau

1

est ici quelque chose de semblable à ce que @Ant mentionné montré appliqué à vos données d'échantillon:

def merged_dicts(dict1, *dicts): 
    for dict_ in dicts: 
     dict1.update(dict_) 
    return dict1 

parsetable = { 
    declarations: 
     merged_dicts(
      { token: 3 for token in [_id, _if, _while, _lbrace, _println] }, 
      { _variable: 2 } 
     ), 
} 

J'ai quitté la copy.deepcopy() préliminaire sur, car il est inutile pour l'utilisation de ce genre.

Questions connexes