J'ai un dictionnaire vide. Nom: dict_x
Il s'agit d'avoir des clés dont les valeurs sont des listes.
À partir d'une itération séparée, j'obtiens une clé (ex:) key_123
et un élément (un tuple) à placer dans la liste de dict_x
la valeur de key_123
.
Si cette clé existe déjà, je souhaite ajouter cet élément. Si cette clé n'existe pas, je veux la créer avec une liste vide, puis y ajouter ou simplement la créer avec un tuple.
À l'avenir, lorsque cette clé apparaîtra de nouveau, puisqu'elle existe, je veux que la valeur soit à nouveau ajoutée.
Mon code se compose 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] == []
Ensuite:
dict_x[key].append(value)
Est-ce la manière de procéder? Dois-je essayer d'utiliser des try/except
blocs?
dict_x[key] = [some_value] if not dict_x.has_key(key) else dict_x[key] + [some_value]
mais cette réponse suggère une bien meilleure façon. En fait, il obtientset()
comme argument et vous permet d'utiliser laadd()
méthode ...Voici les différentes façons de le faire afin que vous puissiez comparer son apparence et choisir ce que vous aimez. Je les ai commandés d'une manière que je pense être la plus "pythonique" , et j'ai commenté les avantages et les inconvénients qui pourraient ne pas être évidents à première vue:
Utilisation
collections.defaultdict
:Points positifs: Probablement les meilleures performances. Inconvénients: non disponible dans Python 2.4.x.
Utilisation
dict().setdefault()
:Inconvénients: création inefficace de
list()
s.Utilisation
try ... except
:Ou:
la source
.setdefault()
crée des dictionnaires inutiles. Je pense que je crée deslist
s inutiles (c'est-à-dire[]
) dans le deuxième argument de.setdefault()
qui n'est jamais utilisé s'ilkey
existe déjà. Je pourrais utiliserdict.setdefault()
(pour un hachage efficace des clés), et utiliser une variable pour réutiliser leslist
s inutilisés mais cela ajoute quelques lignes de code supplémentaires..setdefault
crée unedict
recherche de clé régulière où la recherche de clé absente entraînera unKeyError
certain tempscollections.defaultdict(list)
crée unedict
recherche de clé où l'absence de clé insérera un videlist
- je pense que vous devriez choisir en fonction du comportement que vous voulezVous pouvez utiliser un defaultdict pour cela.
C'est légèrement plus efficace que
setdefault
puisque vous ne finissez pas par créer de nouvelles listes que vous n'utilisez pas. Chaque appel àsetdefault
va créer une nouvelle liste, même si l'élément existe déjà dans le dictionnaire.la source
Vous pouvez utiliser defaultdict dans
collections
.Un exemple de doc:
la source
la source
dict.get
).