web-dev-qa-db-fra.com

Ajouter un dictionnaire à un dictionnaire?

J'ai deux dictionnaires existants et je souhaite "annexer" l'un d'entre eux à l'autre. J'entends par là que la clé, les valeurs de l'autre dictionnaire doivent être intégrées au premier dictionnaire. Par exemple:

orig = {
   'A': 1,
   'B': 2,
   'C': 3,
}

extra = {
   'D': 4,
   'E': 5,
}

dest = # something here involving orig and extra

print dest
{
   'A': 1,
   'B': 2,
   'C': 3,
   'D': 4,
   'E': 5
}

Je pense que tout cela peut être réalisé via une boucle for (peut-être?), Mais existe-t-il une méthode de dictionnaires ou un autre module permettant de sauvegarder ce travail pour moi? Les dictionnaires que j'utilise sont vraiment gros ...

282
Javier Novoa C.

Tu peux faire

orig.update(extra)

ou, si vous ne voulez pas que orig soit modifié, faites d'abord une copie:

dest = dict(orig)  # or orig.copy()
dest.update(extra)

Notez que si extra et orig ont des clés qui se chevauchent, la valeur finale sera extraite de extra. Par exemple,

>>> d1 = {1: 1, 2: 2}
>>> d2 = {2: 'ha!', 3: 3}
>>> d1.update(d2)
>>> d1
{1: 1, 2: 'ha!', 3: 3}
434
mipadi

Le moyen le plus pythonique (et légèrement plus rapide) d'y parvenir est de:

dest = {**orig, **extra}

Ou, selon le problème à résoudre, peut-être:

dest = {**orig, 'D': 4, 'E': 5}
58
Nuno André

En supposant que vous ne souhaitiez pas changer orig, vous pouvez soit faire une copie et mettre à jour comme les autres réponses, soit créer un nouveau dictionnaire en une étape en transmettant tous les éléments des deux dictionnaires au constructeur de dict:

from itertools import chain
dest = dict(chain(orig.items(), extra.items()))

Ou sans outils informatiques:

dest = dict(list(orig.items()) + list(extra.items()))

Notez qu'il vous suffit de transmettre le résultat de items() à list() sur Python 3, sur 2.x dict.items() renvoie déjà une liste, vous permettant ainsi de faire simplement dict(orig.items() + extra.items()).

Comme cas d'utilisation plus général, supposons que vous ayez une liste plus longue de dict que vous souhaitez combiner en un seul dict, vous pouvez faire quelque chose comme ceci:

from itertools import chain
dest = dict(chain.from_iterable(map(dict.items, list_of_dicts)))
24
Andrew Clark

dict.update() on dirait que cela fera ce que vous voulez ...

>> orig.update(extra)
>>> orig
{'A': 1, 'C': 3, 'B': 2, 'E': 5, 'D': 4}
>>> 

Cependant, vous ne voulez peut-être pas mettre à jour votre dictionnaire d'origine, mais travailler sur une copie:

>>> dest = orig.copy()
>>> dest.update(extra)
>>> orig
{'A': 1, 'C': 3, 'B': 2}
>>> dest
{'A': 1, 'C': 3, 'B': 2, 'E': 5, 'D': 4}
17
Johnsyweb

Il y a la méthode .update () :)

pdate ([other]) Mettez à jour le dictionnaire avec les paires clé/valeur des autres clés, en remplaçant les clés existantes. Renvoyer Aucun.

update () accepte soit un autre objet du dictionnaire, soit une variable de paires clé/valeur (comme des nuplets ou d'autres variables de longueur deux). Si des arguments de mot clé sont spécifiés, le dictionnaire est mis à jour avec les paires clé/valeur suivantes: d.update (red = 1, blue = 2).

Modifié dans la version 2.4: L'argument est autorisé à être un objet itérable des paires clé/valeur et des arguments de mots clés autorisés.

7
sleeplessnerd

La réponse que je veux donner est "use collections.ChainMap", mais je viens de découvrir qu'il n'a été ajouté que dans Python 3.3: https://docs.python.org/ 3.3/library/collections.html # chainmap-objects

Vous pouvez essayer de crier la classe à partir de la source 3.3: http://hg.python.org/cpython/file/3.3/Lib/collections/ init . py # l763

Voici une version moins complète Python 2.x compatible (même auteur): http://code.activestate.com/recipes/305268-chained-map-lookups/

Au lieu de développer/remplacer un dictionnaire par un autre à l'aide de dict.merge ou de créer une copie supplémentaire fusionnant les deux, vous créez une chaîne de recherche qui effectue une recherche dans l'ordre. Parce qu'il ne duplique pas les mappages qu'il recouvre, ChainMap utilise très peu de mémoire et voit les modifications ultérieures apportées aux sous-mappages. Parce que l'ordre est important, vous pouvez également utiliser la chaîne pour superposer les valeurs par défaut (par exemple, préférences utilisateur> config> env).

7
kitsu.eb

Un tri-liner pour combiner ou fusionner deux dictionnaires:

dest = {}
dest.update(orig)
dest.update(extra)

Cela crée un nouveau dictionnaire dest sans modifier orig et extra.

Remarque: Si une clé a des valeurs différentes dans orig et extra, alors extra annule orig.

3
jkdev