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èsd[key]
, et beaucoup (soit près de 10 fois plus rapide qu'und[key]
+except: pass
(certes, il est peut-être légèrement plus rapide qu'un expliciteif
si la clé est presque toujours présent). Maintenant,key in d.keys()
(Python 2.x) oukey 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.
Vous devez vous connecter pour publier un commentaire.
Avec
key in dct
, c'est à dire explicitement.Si c'est vraiment trop cher pour vous (mesure et vous serez sûr), il y a des solutions pour des situations spécifiques. E. g., si votre valeur par défaut est
'ham'
et dans certaines situations, vous ne voulez pas stocker(key, 'ham')
dans ledefaultdict
quandkey
n'est pas trouvé, vous pouvez le fairehas_key
est dépréciée en faveur dekey in dct
- merci de ne pas promouvoir l'utilisation de vieux idiomes.key in dct
a pour être rapide, en disant que c'est lent serait comme dire quedct[key]
est lente, et qui ne doit jamais être le cas. La récupération d'un élément à partir d'un dictionnaire donné sa clé et le test d'appartenance d'une clé à O(1) opérations dans tout bon dictionnaire de la mise en œuvre, et il est facile de voir comment les membres de l'opération pourrait être mis en œuvre dans les conditions de l'opération d'accès.Pour votre question avec
defaultdict
, il suffit d'utiliserin
. Et il n'y a aucune raison d'éviter l'utilisation dein
normale dans un dictionnaire.