Python dict comment créer une clé ou ajouter un élément à la clé?
J'ai un dictionnaire vide. Nom: dict_x
C'est pour avoir des clés dont les valeurs sont des listes.
À Partir d'une autre itération, - je obtenir une clé (ex: key_123
), et un élément (un tuple) à placer dans la liste de dict_x
's valeur key_123
.
Si cette clé existe déjà, je veux ajouter cet élément. Si cette clé n'existe pas, je veux créer une liste vide, puis ajouter ou créez-le avec un n-uplet en elle.
À l'avenir, quand cette clé réapparaîtra, puisqu'elle existe, je veux la valeur ajoutée de nouveau.
Mon code se compose de ceci:
Récupère la clé et la valeur.
Voir si la cléNOT existe dans
dict_x
.Et si ce n'est pas le créer:
dict_x[key] == []
Par la Suite:
dict_x[key].append(value)
Est-ce la façon de le faire? Dois-je essayer d'utiliser des blocs try/except
?
4 réponses
Utiliser dict.setdefault()
:
dic.setdefault(key,[]).append(value)
Aide (dict.setdefault):
setdefault(...)
D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D
Voici les différentes façons de le faire afin que vous puissiez comparer à quoi il ressemble et choisir ce que vous aimez. Je les ai commandés d'une manière que je pense la plus "pythonic" , et commenté les avantages et les inconvénients qui pourraient ne pas être évidents à première vue:
À l'Aide de collections.defaultdict
:
import collections
dict_x = collections.defaultdict(list)
...
dict_x[key].append(value)
Avantages: probablement la meilleure performance. Inconvénients: non disponible en Python 2.4.X.
À l'Aide de dict().setdefault()
:
dict_x = {}
...
dict_x.setdefault(key, []).append(value)
Inconvénients: création inefficace d'inutilisés list()
s.
À l'Aide de try ... except
:
dict_x = {}
...
try:
values = dict_x[key]
except KeyError:
values = dict_x[key] = []
values.append(value)
Ou:
try:
dict_x[key].append(value)
except KeyError:
dict_x[key] = [value]
, Vous pouvez utiliser un defaultdict pour ce.
from collections import defaultdict
d = defaultdict(list)
d['key'].append('mykey')
Ceci est légèrement plus efficace que setdefault
puisque vous ne finissez pas par créer de nouvelles listes que vous ne finissez pas par utiliser. Chaque appel de setdefault
va créer une nouvelle liste, même si l'élément existe déjà dans le dictionnaire.
Vous pouvez utiliser defaultdict dans collections
.
Un exemple de doc:
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
d = defaultdict(list)
for k, v in s:
d[k].append(v)