假设有如下字典:
my_map = {'a': 1, 'b': 2}
如何反转该地图以获得以下结果:
inv_map = {1: 'a', 2: 'b'}
假设有如下字典:
my_map = {'a': 1, 'b': 2}
inv_map = {1: 'a', 2: 'b'}
我用循环'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
不是完全不同的东西,只是从食谱中稍微改写了一下。此外,通过保留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()
在我的计算机上运行比这里的其他示例快一些
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)
{"foo": "bar"}
转换为 {'b': ['foo'], 'a': ['foo'], 'r': ['foo']}
,并且如果 myDict
中的任何值不是可迭代对象,则会引发异常。我不确定你试图实现什么行为,但你实际上实现的是几乎没有人想要的东西。 - Mark Amery
dict
,然后在最后转换为所需的类(而不是从正确类型的类开始)看起来对我来说会产生完全可以避免的性能损失。 - Mark Amery