J'ai un dictionnaire vide. Nom: dict_x
C'est avoir des clés dont les valeurs sont des listes.
D'une itération séparée, j'obtiens une clé (ex: key_123
) et un élément (un Tuple) à placer dans la liste des valeurs de dict_x
key_123
.
Si cette clé existe déjà, je souhaite ajouter cet élément. Si cette clé n'existe pas, je souhaite la créer avec une liste vide, puis l'ajouter ou simplement la créer avec un tuple.
À l'avenir, lorsque cette clé sera à nouveau utilisée, car elle existe, je souhaite que la valeur soit ajoutée à nouveau.
Mon code est composé de ceci:
Obtenez la clé et la valeur.
Voir si la clé NOT existe dans
dict_x
.et sinon créez-le:
dict_x[key] == []
Après:
dict_x[key].append(value)
Est-ce la façon de le faire? Dois-je essayer d'utiliser des blocs try/except
?
Utilisez dict.setdefault()
:
dic.setdefault(key,[]).append(value)
help (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 manières de le faire afin que vous puissiez comparer son apparence et choisir ce que vous aimez. Je les ai commandés de la manière qui me semble la plus "Pythonic" , et j'ai commenté les avantages et les inconvénients qui pourraient ne pas sembler évidents à première vue:
tilisation de collections.defaultdict
:
import collections
dict_x = collections.defaultdict(list)
...
dict_x[key].append(value)
Avantages: Probablement la meilleure performance. Inconvénients: non disponible dans Python 2.4.x.
tilisation de dict().setdefault()
:
dict_x = {}
...
dict_x.setdefault(key, []).append(value)
Inconvénients: création inefficace de list()
s inutilisée.
tilisation 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 cela.
from collections import defaultdict
d = defaultdict(list)
d['key'].append('mykey')
Ceci est légèrement plus efficace que setdefault
puisque vous ne créez pas de nouvelles listes que vous n'utilisez pas. Chaque appel à setdefault
créera 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)