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 ...
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}
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}
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)))
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}
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.
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).
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
.