给定一本这样的字典:

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

如何将此映射颠倒得到:

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

当前回答

非双射地图的快速功能性解决方案(值不唯一):

from itertools import imap, groupby

def fst(s):
    return s[0]

def snd(s):
    return s[1]

def inverseDict(d):
    """
    input d: a -> b
    output : b -> set(a)
    """
    return {
        v : set(imap(fst, kv_iter))
        for (v, kv_iter) in groupby(
            sorted(d.iteritems(),
                   key=snd),
            key=snd
        )
    }

理论上,这应该比命令式解决方案中那样逐个添加到集合(或添加到列表)更快。

不幸的是,值必须是可排序的,排序是由groupby要求的。

其他回答

字典值为集合的一种情况。如:

some_dict = {"1":{"a","b","c"},
        "2":{"d","e","f"},
        "3":{"g","h","i"}}

逆函数是:

some_dict = {vi: k  for k, v in some_dict.items() for vi in v}

输出如下:

{'c': '1',
 'b': '1',
 'a': '1',
 'f': '2',
 'd': '2',
 'e': '2',
 'g': '3',
 'h': '3',
 'i': '3'}

我在循环'for'和方法'.get()'的帮助下写了这篇文章,我把字典的'map'名字改为'map1',因为'map'是一个函数。

def dict_invert(map1):
    inv_map = {} # new dictionary
    for key in map1.keys():
        inv_map[map1.get(key)] = key
    return inv_map
dict([(value, key) for key, value in d.items()])

Python 3 +:

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

Python 2:

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

有很多答案,但没有找到任何干净的东西,以防我们谈论的是一个具有非唯一值的字典。

解决办法是:

from collections import defaultdict

inv_map = defaultdict(list) 
for k, v in my_map.items(): 
    inv_map[v].append(k)

例子:

如果初始dict my_map ={“c”:1、“d”:5,' ':5 b: 10}

然后,运行上面的代码将得到:

{5: ['a', 'd'], 1: ['c'], 10: ['b']}