2
votes

Fusionner deux vues de dictionnaire en python

Comment fusionner les vues des éléments de deux dictionnaires en python?

Mon cas d'utilisation est: J'ai deux dictionnaires privés dans une classe. Je veux que l'API les traite comme un seul et fournisse une méthode items en tant que telle. Le seul moyen que je connaisse est de les combiner puis de fournir une vue sur les deux, mais pour les grands dictionnaires, cela semble coûteux. Je pense à qc comme a.items () + b.items ()

Remarque: je ne me soucie pas des conflits de clés.

Voici ce que j'aimerais améliorer:

class A:
    _priv1 = {'a': 1, 'b': 2}
    _priv2 = {'c': 1, 'd': 2}

    def items(self):
        return {**self._priv1, **self._priv2}.items()


0 commentaires

4 Réponses :


1
votes

La fusion des vues des dictionnaires ne signifie rien car une vue reflète toujours le contenu du dictionnaire correspondant.

Donc, pour avoir une vue différente, soit vous éditez l'un de vos dictionnaires, soit vous en instanciez un nouveau (comme vous l'avez fait), il n'y a pas moyen de le contourner. Voir ceci .

Mais peut-être que ce que vous voulez, c'est itertools.chain pour itérer sur plusieurs itérables. Cette solution n'est pas insatiable. Ou comme d'autres l'ont dit collections.ChainMap < / a>. J'utiliserais chain pour itérer et ChainMap pour faire des recherches.


0 commentaires


1
votes

Vous pouvez utiliser ChainMap:

from collections import ChainMap

class A:
    _priv1 = {'a': 1, 'b': 2}
    _priv2 = {'c': 1, 'd': 2}

    def items(self):
        return ChainMap(self._priv1, self._priv2)


0 commentaires