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?

90
demandé sur Arvand 2012-10-16 04:42:07

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
155
répondu Ashwini Chaudhary 2014-09-30 22:31:35

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]
42
répondu antak 2012-10-16 10:10:48

, 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.

15
répondu Nathan Villaescusa 2018-09-04 21:41:10

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)
9
répondu iMom0 2012-10-16 00:45:42