Pour un dictionnaire statique, combinaison d'instantanés d'autres dicts :
À partir de Python 3.9, l'opérateur binaire "ou". |
a été défini pour concaténer les dictionnaires. (Un nouveau dictionnaire concret est créé avec empressement) :
>>> a = {"a":1}
>>> b = {"b":2}
>>> a|b
{'a': 1, 'b': 2}
À l'inverse, le |=
L'affectation augmentée a été implémentée pour signifier la même chose que l'appel de la fonction update
méthode :
>>> a = {"a":1}
>>> a |= {"b": 2}
>>> a
{'a': 1, 'b': 2}
Pour plus de détails, consultez PEP-584
Avant Python 3.9, la manière la plus simple de créer un nouveau dictionnaire est de créer un nouveau dictionnaire en utilisant "l'expansion en étoile" pour ajouter le contenu de chaque sous-annexe à la place :
c = {**a, **b}
Pour la combinaison dynamique de dictionnaires, en travaillant comme "vue" à des dicts combinés et vivants :
Si vous avez besoin que les deux dictionnaires restent indépendants et qu'ils puissent être mis à jour, vous pouvez créer un objet unique qui interroge les deux dictionnaires dans sa fonction de recherche. __getitem__
(et mettre en œuvre la méthode get
, __contains__
et d'autres méthodes de cartographie selon vos besoins).
Un exemple minimaliste pourrait être le suivant :
class UDict(object):
def __init__(self, d1, d2):
self.d1, self.d2 = d1, d2
def __getitem__(self, item):
if item in self.d1:
return self.d1[item]
return self.d2[item]
Et ça marche :
>>> a = UDict({1:1}, {2:2})
>>> a[2]
2
>>> a[1]
1
>>> a[3]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 7, in __getitem__
KeyError: 3
>>>
NB : Si l'on veut maintenir paresseusement une "vue" de l'Union de deux ou plusieurs dictionnaires, vérifiez collections.ChainMap
dans la bibliothèque standard - car elle possède toutes les méthodes du dictionnaire et couvre les cas particuliers qui ne sont pas couverts par la bibliothèque. pas envisagés dans l'exemple ci-dessus.