[PYTHON] 4 façons de gérer les clés de dict manquantes

Articles efficaces Python 2nd Edition-90 pour améliorer le programme Python est vraiment merveilleux, donc je le lis en pleurant.

Il y avait un élément sur la façon de traiter la clé manquante de dict, donc j'aimerais que vous lisiez ce livre pour plus de détails, mais je l'ai mesuré parce que je m'inquiétais du temps de traitement de chacun.

Cette fois, c'est assez facile, mais j'écrirai un processus pour compter les caractères qui apparaissent dans une certaine chaîne de caractères. L'environnement d'exécution est celui par défaut de Google Colab.

Tout d'abord, importez les bibliothèques requises.

import time, defaultdict

Ciblez une chaîne de caractères appropriée pour l'agrégation.

target = 'super_string_of_my_passages. but this does not make sense at all. because this is nothing'

Enfin, la valeur-clé triée par le nombre d'occurrences est sortie et le résultat attendu est le suivant.

[('s', 13),
 (' ', 12),
 ('e', 8),
 ('t', 7),
 ('a', 6),
 ('i', 5),
 ('n', 5),
 ('_', 4),
 ('o', 4),
 ('u', 3),
 ('g', 3),
 ('h', 3),
 ('p', 2),
 ('r', 2),
 ('m', 2),
 ('.', 2),
 ('b', 2),
 ('l', 2),
 ('f', 1),
 ('y', 1),
 ('d', 1),
 ('k', 1),
 ('c', 1)]

When in est utilisé dans l'instruction if

L'instruction if vérifie si la clé existe et donne à la clé manquante une valeur initiale en utilisant une expression in qui renvoie True. Probablement la première façon simple de trouver.

%%time
ranking = {}
for key in target:
    if key in ranking.keys():
        count = ranking[key]
    else:
        count = 0
    ranking[key] = count + 1
sorted(ranking.items(), key=lambda x: x[1], reverse=True)

CPU times: user 45 µs, sys: 9 µs, total: 54 µs Wall time: 56.3 µs

Lors de l'utilisation de KeyError dans l'instruction try

Utilisez l'instruction try-except pour gérer l'erreur KeyError qui est la cause de l'erreur comme une erreur attendue.

%%time
ranking = {}
for key in target:
    try:
        count = ranking[key]
    except KeyError:
        count = 0
    ranking[key] = count + 1
sorted(ranking.items(), key=lambda x: x[1], reverse=True)   

CPU times: user 59 µs, sys: 11 µs, total: 70 µs Wall time: 78.2 µs

Lors de l'utilisation de la méthode get

Utilisez la méthode get fournie par le dict intégré.

%%time
ranking = {}
for key in target:
    count = ranking.get(key, 0)
    ranking[key] = count + 1
sorted(ranking.items(), key=lambda x: x[1], reverse=True)   

CPU times: user 43 µs, sys: 8 µs, total: 51 µs Wall time: 53.6 µs

Lors de l'utilisation de defaultdict

%%time
ranking = defaultdict(int)

for s in target:
    ranking[s] += 1
sorted(ranking.items(), key=lambda x: x[1], reverse=True)

CPU times: user 36 µs, sys: 8 µs, total: 44 µs  Wall time: 47.2 µs

Conclusion

Le defaultdict peut être bon! (* ^^)

Édition supplémentaire

C'est tout pour les méthodes couvertes dans ce livre, Hé, si vous faites ce genre de traitement, vous pouvez l'utiliser! Tu ne peux pas l'oublier? Je vais l'écrire comme une édition supplémentaire car il semble y être inséré. Dans un cas aussi simple, vous pouvez utiliser la classe Counter de la bibliothèque de collections. C'est une méthode pratique qui compte le nombre d'occurrences dans chaque élément. Puisqu'il existe une méthode la plus courante qui trie par le nombre, utilisez-la.

from collections import Counter

%%time
ranking = Counter(target)
ranking.most_common()

CPU times: user 53 µs, sys: 0 ns, total: 53 µs Wall time: 56.5 µs

Merci beaucoup!

Recommended Posts

4 façons de gérer les clés de dict manquantes
2 façons de gérer SessionNotCreatedException
Comment gérer les données déséquilibrées
Comment gérer les erreurs de compatibilité d'énumération
Différentes façons de détruire des ressources avec une portée
Comment gérer les fuites de mémoire dans matplotlib.pyplot
Comment gérer les erreurs en frappant pip ②
ne peut pas décaper. Comment gérer les objets Annoy
Comment gérer le module 'Sensorflow' n'a aucun attribut '
Méthode pour obtenir toutes les clés du dict imbriqué
La solution de contournement pour le modèle de Django n'existe pas
Comment gérer l'échec de l'initialisation pyenv dans Fish 3.1.0
[Python] Comment gérer l'erreur de lecture pandas read_html
Comment gérer l'exécution de la transaction: échec dans Anaconda
Convertir dict en tableau
[AWS] Comment gérer l'erreur "Point de code non valide" dans CloudSearch
Pour les débutants, comment gérer les erreurs courantes dans les keras
Comment gérer UnicodeDecodeError lors de l'exécution du téléchargement d'image Google