Question Python inverse / inverser une cartographie


Étant donné un dictionnaire comme ça:

my_map = { 'a': 1, 'b':2 }

Comment peut-on inverser cette carte pour obtenir:

inv_map = { 1: 'a', 2: 'b' }

NOTE DE L'EDITEUR:  map changé en my_map pour éviter les conflits avec la fonction intégrée, map. Certains commentaires peuvent être affectés ci-dessous.


443
2018-01-27 14:46


origine


Réponses:


Pour Python 2.7.x

inv_map = {v: k for k, v in my_map.iteritems()}

Pour Python 3+:

inv_map = {v: k for k, v in my_map.items()}

607
2018-01-27 15:24



En supposant que les valeurs dans le dict sont uniques:

dict((v, k) for k, v in my_map.iteritems())

158
2018-01-27 14:50



Si les valeurs dans my_map ne sont pas uniques:

inv_map = {}
for k, v in my_map.iteritems():
    inv_map[v] = inv_map.get(v, [])
    inv_map[v].append(k)

104
2018-01-27 21:33



def inverse_mapping(f):
    return f.__class__(map(reversed, f.items()))

30
2017-11-05 10:41



Essaye ça:

inv_map = dict(zip(my_map.values(), my_map.keys()))

(Notez que les documents Python sur les vues du dictionnaire garantir explicitement que .keys() et .values() avoir leurs éléments dans le même ordre, ce qui permet à l'approche ci-dessus de fonctionner.)

Alternativement:

inv_map = dict((my_map[k], k) for k in my_map)

ou en utilisant les interprétations de dict de python 3.0

inv_map = {my_map[k] : k for k in my_map}

26
2018-01-27 14:49



Un autre, plus fonctionnel, façon:

my_map = { 'a': 1, 'b':2 }
dict(map(reversed, my_map.items()))

16
2018-02-26 16:35



Cela élargit la réponse Python inverse / inverser une cartographie, s'appliquant à quand les valeurs dans le dict ne sont pas uniques.

class ReversibleDict(dict):

    def reversed(self):
        """
        Return a reversed dict, with common values in the original dict
        grouped into a list in the returned dict.

        Example:
        >>> d = ReversibleDict({'a': 3, 'c': 2, 'b': 2, 'e': 3, 'd': 1, 'f': 2})
        >>> d.reversed()
        {1: ['d'], 2: ['c', 'b', 'f'], 3: ['a', 'e']}
        """

        revdict = {}
        for k, v in self.iteritems():
            revdict.setdefault(v, []).append(k)
        return revdict

La mise en œuvre est limitée à ce que vous ne pouvez pas utiliser reversed deux fois et récupérer l'original. Ce n'est pas symétrique en tant que tel. Il est testé avec Python 2.6. Ici est un cas d'utilisation de la façon dont j'utilise pour imprimer la dict résultante.

Si vous préférez utiliser un set qu'un list, et il y a des applications pour lesquelles cela a du sens, au lieu de setdefault(v, []).append(k), utilisation setdefault(v, set()).add(k).


6
2017-10-24 20:40