Reverse / invert a dictionary mapping

前端 未结 26 2814
一整个雨季
一整个雨季 2020-11-21 11:47

Given a dictionary like so:

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

How can one invert this map to get:

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


        
26条回答
  •  刺人心
    刺人心 (楼主)
    2020-11-21 12:05

    Not something completely different, just a bit rewritten recipe from Cookbook. It's futhermore optimized by retaining setdefault method, instead of each time getting it through the instance:

    def inverse(mapping):
        '''
        A function to inverse mapping, collecting keys with simillar values
        in list. Careful to retain original type and to be fast.
        >> d = dict(a=1, b=2, c=1, d=3, e=2, f=1, g=5, h=2)
        >> inverse(d)
        {1: ['f', 'c', 'a'], 2: ['h', 'b', 'e'], 3: ['d'], 5: ['g']}
        '''
        res = {}
        setdef = res.setdefault
        for key, value in mapping.items():
            setdef(value, []).append(key)
        return res if mapping.__class__==dict else mapping.__class__(res)
    

    Designed to be run under CPython 3.x, for 2.x replace mapping.items() with mapping.iteritems()

    On my machine runs a bit faster, than other examples here

提交回复
热议问题