Nouveau dans Python et ce qui ressemble à un simple morceau de code réalisable donnant KeyError:
patt=list('jkasb')
dict={}
for i in patt:
dict[i]= 1 if dict[i] is None else dict[i]+1 # This line throws error
erreur: KeyError: 'j'
5 Réponses :
Ces extraits: dict [i] et dict [i] +1 essaieront d'obtenir une valeur du dictionnaire avec la clé correspondante i code>. Puisque vous n'avez rien dans votre dictionnaire, vous obtenez une KeyError.
Comme votre dict est initialement vide, essayer d'accéder à n'importe quelle valeur avec dict [i] lancera une KeyError .
Vous devrait remplacer cela par .get () qui renvoie None si la clé n'est pas trouvée:
for i in patt:
dict[i] = 1 if i not in dict else dict[i] + 1
Une autre alternative, comme suggéré par @snakecharmerb, est de vérifier au préalable si ou pas la clé existe dans votre dict:
for i in patt:
dict[i] = 1 if dict.get(i) is None else dict[i] + 1
Les deux solutions sont équivalentes, mais la seconde est peut-être plus "idiomatique".
ou simplement dict [i] = dict.get (i, 0) + 1
je l'ai. Je ne sais pas qu'ils ont fait que dict [] et dict.get ont un comportement différent.
Lors de la construction du dict dict , dict [i] essaie d'accéder à une clé qui n'existe pas encore, afin de vérifier si une clé existe dans un dictionnaire , utilisez plutôt l'opérateur in :
from collections import Counter
d = Counter('jkasb')
Alternatives (pour ce que vous essayez d'accomplir):
dict.get : from collections import defaultdict
d = defaultdict(int)
for i in 'jkasb':
d[i] += 1
collections.defaultdict : d[i] = d.get(i, 0) + 1
collections.Counter : d[i] = 1 if i not in d else d[i] + 1
Évitez d'utiliser dict ( type intégré) comme nom de variable. Et il suffit de parcourir 'jkasb' sans avoir à le convertir en liste, les chaînes sont également itérables.
vous essayez d'accéder à une clé dans un dictionnaire vide, vous pouvez également utiliser defaultdic donc vous ne vous souciez pas si la clé existe déjà ou non:
from collections import defaultdict
patt=list('jkasb')
my_dict = defaultdict(int)
for i in patt:
my_dict[i] += 1
Dans votre cas, l'erreur KeyError se produit parce que vous essayez d'accéder à une clé qui n'est pas dans le dictionnaire. Au départ, le dictionnaire est vide. Donc, aucune des clés n'existe.
Cela peut sembler étrange si vous venez d'un arrière-plan C ++ car les cartes C ++ donnent des valeurs par défaut pour des clés qui n'existent pas encore. Vous pouvez obtenir le même comportement en python en utilisant collections.defaultdict . Le code modifié est donné ci-dessous. J'ai pris la liberté de convertir le defaultdict en dictionnaire normal à la fin du code:
from collections import Counter patt='jkasb' character_counter = Counter(patt) my_dict = dict(character_counter)
Vous pouvez également résoudre ce problème de plusieurs autres façons. J'en montre quelques-uns ci-dessous:
En vérifiant si la clé existe dans le dictionnaire:
patt='jkasb'
my_dict={}
for i in patt:
my_dict[i]= my_dict.get(i, 0)+1 # using dict.get with default return value 0
Utilisation de dict.get () sans valeurs de retour par défaut:
patt='jkasb'
my_dict={}
for i in patt:
my_dict[i]= 1 if my_dict.get(i) is None else my_dict[i]+1 # using dict.get
print(my_dict)
Utilisation de dict.get () avec les valeurs de retour par défaut:
patt='jkasb'
my_dict={}
for i in patt:
my_dict[i]= 1 if i not in my_dict else my_dict[i]+1 # checking if i exists in dict
Comme votre code ne compte en fait que la fréquence de chaque caractère, vous pouvez également utiliser collections.Counter , puis le convertir en dictionnaire: p>
from collections import defaultdict
patt='jkasb'
my_default_dict=defaultdict(int)
for i in patt:
my_default_dict[i]+=1
my_dict = dict(my_default_dict) # converting the defaultdict to a regular dictionary
De plus, comme dict est un type de données intégré et que j'ai utilisé dict pour convertir le defaultdict et le compteur en un dictionnaire normal, j'ai changé le nom du dictionnaire de dict en my_dict.
if dict [i] is Nonegénère une erreur car il n'y a pas encore dedict [i].Aussi, ne donnez pas à vos variables le nom des fonctions intégrées (comme
dict, ici)