反转字典映射

1030

假设有如下字典:

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

如何反转该地图以获得以下结果:
inv_map = {1: 'a', 2: 'b'}
33个回答

-2

我用循环'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

-2

不是完全不同的东西,只是从食谱中稍微改写了一下。此外,通过保留setdefault方法进行优化,而不是每次通过实例获取它:

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)

旨在运行在 CPython 3.x 下,如需在 2.x 中使用,请将 mapping.items() 替换为 mapping.iteritems()

在我的计算机上运行比这里的其他示例快一些


1
将结果构建为 dict,然后在最后转换为所需的类(而不是从正确类型的类开始)看起来对我来说会产生完全可以避免的性能损失。 - Mark Amery

-2
如果值不唯一且可能是哈希(一维):
for k, v in myDict.items():
    if len(v) > 1:
        for item in v:
            invDict[item] = invDict.get(item, [])
            invDict[item].append(k)
    else:
        invDict[v] = invDict.get(v, [])
        invDict[v].append(k)

而且,如果你需要深入挖掘不止一维的情况下,可以使用递归:
def digList(lst):
    temp = []
    for item in lst:
        if type(item) is list:
            temp.append(digList(item))
        else:
            temp.append(item)
    return set(temp)

for k, v in myDict.items():
    if type(v) is list:
        items = digList(v)
        for item in items:
            invDict[item] = invDict.get(item, [])
            invDict[item].append(k)
    else:
        invDict[v] = invDict.get(v, [])
        invDict[v].append(k)

你可以使用defaultdict来改进你的解决方案:它将消除所有的invDict[item] = invDict.get(item, [])行。 - gabuzo
你的第一种方法将 {"foo": "bar"} 转换为 {'b': ['foo'], 'a': ['foo'], 'r': ['foo']},并且如果 myDict 中的任何值不是可迭代对象,则会引发异常。我不确定你试图实现什么行为,但你实际上实现的是几乎没有人想要的东西。 - Mark Amery

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接