web-dev-qa-db-fra.com

Python dictez comment créer une clé ou ajouter un élément à une clé?

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_xkey_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?

127
Phil

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
205
Ashwini Chaudhary

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]
54
antak

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.

20
Nathan Villaescusa

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)
11
iMom0