Comment vérifier une clé dans une defaultdict sans mise à jour du dictionnaire (Python)?

J'ai l'habitude de suivre la marche suivante lorsque vous travaillez avec un Python dictionnaire:

try:
    val = dct[key]
except KeyError:
    print key, " is not valid"

depuis pour les grands dictionnaires, la déclaration

if key in dct:
    # do something

n'est pas très efficace (je me souviens de la lecture, mais je l'ai remarqué dans la pratique ainsi)

Aujourd'hui, je travaillais avec un defaultdict et pour un instant, j'ai oublié qu'un defaultdict ne vous donnera jamais un KeyError mais plutôt de mettre à jour le dictionnaire original.

Comment puis-je effectuer une recherche sans mettre à jour le defaultdict? J'ai vraiment besoin d'imprimer une erreur, de sorte que l'utilisateur peut entrer de nouveau sur la touche.

Merci!

Mise à JOUR: Plusieurs affiches suggéré que ma conviction que if key in dct: est lent, c'est faux. Je suis allé en arrière et de vérifier le livre dans lequel j'avais lu c'est mieux d'utiliser try: except:. C'est en 2002 du Python livre de cuisine, Recette de 1,4 par Alex Martelli, qui se trouve également en ligne ici: Ajouter une entrée de dictionnaire. De vieux souvenirs sont donc pas fiables! La recette ne mentionne pas les "lents" et il n'est même pas à l'aide de in mais has_key. Il dit simplement que try: except: est plus Pythonic (au moins la version du livre de la recette). Merci pour la correction et les réponses.

  • Possible en double stackoverflow.com/questions/1602934/...
  • Pas dupe; celui-ci est sur le defaultdict.
  • key in d n'est pas lent, période. Si vous dire le contraire, il vaut mieux avoir une preuve solide. timeit dit que c'est aussi rapide qu'un succès d[key], et beaucoup (soit près de 10 fois plus rapide qu'un d[key] + except: pass (certes, il est peut-être légèrement plus rapide qu'un explicite if si la clé est presque toujours présent). Maintenant, key in d.keys() (Python 2.x) ou key in list(d.keys()) (Python 3.x) est lent, mais parce que c'est délibérément que de jeter de la table de hachage de l'information.
  • Doit voir cette réponse.
InformationsquelleAutor Lejlek | 2012-01-28