Quelle est la meilleure façon d'étendre un dictionnaire avec un autre? Par exemple:
>>> a = { "a" : 1, "b" : 2 }
>>> b = { "c" : 3, "d" : 4 }
>>> a
{'a': 1, 'b': 2}
>>> b
{'c': 3, 'd': 4}
Je recherche une opération pour obtenir cette for
boucle d' évitement :
{ "a" : 1, "b" : 2, "c" : 3, "d" : 4 }
Je souhaite faire quelque chose comme:
a.extend(b) # This does not work
python
dictionary
FerranB
la source
la source
Réponses:
Dernière documentation de la bibliothèque standard Python
la source
{"a":2, "b":3}
avec dict{"b":4, "c":5}
to dict{"a":2, "b":3,"c":5}
? Bien sûr, il est possible de l'utiliserupdate()
en déplaçant des trucs, mais ce serait mieux si cela pouvait être accompli en une seule ligne ...update
écrasement des entrées existantes est silencieux. C'est-à-dire que toutes les valeursb
écrasent cellesa
des clés qui se chevauchent.Un beau bijou dans cette question fermée :
La "voie oneliner", ne modifiant aucun des dits d'entrée, est
Découvrez ce que
**basket_two
(le**
) signifie ici .En cas de conflit, les éléments de
basket_two
remplaceront ceux debasket_one
. En ce qui concerne les lignes simples, c'est assez lisible et transparent, et je n'ai aucun inconvénient à l'utiliser à chaque fois qu'un dicton qui est un mélange de deux autres est utile (tout lecteur qui a du mal à le comprendre sera en fait très bien servi par la façon dont cela l'incite à se renseigner surdict
le**
formulaire ;-). Ainsi, par exemple, utilise comme:sont des occurrences assez fréquentes dans mon code.
Présenté à l'origine par Alex Martelli
Remarque: En Python 3, cela ne fonctionnera que si chaque clé de basket_two est un
string
.la source
dict
est facile à trouver tandis qu'elle**
est un peu plus délicate (le mot clé est kwargs ). Voici une belle explication: saltycrane.com/blog/2008/01/…basket_one.update(<dict>)
comme son nom l'indique, met à jour un dictionnaire existant (ou cloné).**anotherdict
, doivent être des chaînes.Avez-vous essayé d'utiliser la compréhension du dictionnaire avec le mappage du dictionnaire:
Une autre méthode consiste à utiliser dict (itérable, ** kwarg)
Dans Python 3.9, vous pouvez ajouter deux dict en utilisant union | opérateur
la source
Ajoutera les clés et les valeurs de b à a , écrasant s'il y a déjà une valeur pour une clé.
la source
Comme d'autres l'ont mentionné,
a.update(b)
pour certains mourantsa
, vousb
obtiendrez le résultat que vous avez demandé dans votre question. Cependant, je tiens à souligner que de nombreuses fois, j'ai vu laextend
méthode de mappage / définition d'objets désirer que dans la syntaxea.extend(b)
,a
les valeurs de '' NE soient PAS écrasées parb
les valeurs de ''.a.update(b)
écrasea
les valeurs de, et n'est donc pas un bon choix pourextend
.Notez que certaines langues appellent cette méthode
defaults
ouinject
, comme cela peut être considéré comme un moyen d'injecter les valeurs de b (qui pourraient être un ensemble de valeurs par défaut) dans un dictionnaire sans écraser les valeurs qui pourraient déjà exister.Bien sûr, vous pouvez simplement noter que
a.extend(b)
c'est presque la même chose queb.update(a); a=b
. Pour supprimer l'affectation, vous pouvez le faire ainsi:Merci à Tom Leys pour cette idée intelligente en utilisant un
dict
constructeur sans effet secondaire pourextend
.la source
Vous pouvez également utiliser les collections de python.Chainmap qui a été introduit dans python 3.3.
Cela présente quelques avantages possibles, selon votre cas d'utilisation. Ils sont expliqués plus en détail ici , mais je vais donner un bref aperçu:
Cela le rend principalement utile pour des choses comme les dictionnaires de configuration.
la source
Si vous en avez besoin en tant que classe , vous pouvez l'étendre avec dict et utiliser la méthode de mise à jour :
la source