给定一本这样的字典:

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

如何将此映射颠倒得到:

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

当前回答

另一种更实用的方法是:

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

其他回答

这是另一种方法。

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

inv_map= {}
for key in my_map.keys() :
    val = my_map[key]
    inv_map[val] = key

试试这个:

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

(请注意,字典视图上的Python文档显式保证.keys()和.values()的元素顺序相同,这允许上述方法工作。)

另外:

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

或者使用python 3.0的字典推导式

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

这将处理非惟一值,并保留惟一情况的大部分外观。

inv_map = {v:[k for k in my_map if my_map[k] == v] for v in my_map.itervalues()}

对于Python 3。X,用值替换itervalues。

我们也可以使用defaultdict来反转一个有重复键的字典:

from collections import Counter, defaultdict

def invert_dict(d):
    d_inv = defaultdict(list)
    for k, v in d.items():
        d_inv[v].append(k)
    return d_inv

text = 'aaa bbb ccc ddd aaa bbb ccc aaa' 
c = Counter(text.split()) # Counter({'aaa': 3, 'bbb': 2, 'ccc': 2, 'ddd': 1})
dict(invert_dict(c)) # {1: ['ddd'], 2: ['bbb', 'ccc'], 3: ['aaa']}  

在这里看到的:

这种技术比使用dict.setdefault()的等效技术更简单、更快。

即使在原始字典中有非唯一的值,这种方法也有效。

def dict_invert(d):
    '''
    d: dict
    Returns an inverted dictionary 
    '''
    # Your code here
    inv_d = {}
    for k, v in d.items():
        if v not in inv_d.keys():
            inv_d[v] = [k]
        else:
            inv_d[v].append(k)
        inv_d[v].sort()
        print(f"{inv_d[v]} are the values")
        
    return inv_d