在python中,如何反转2D字典?

Geo*_*rge 3 python dictionary python-3.x

我有一个以下形式的字典

dict = {
   "a" : {"a1" : 1},
   "b" : {"a2" : 1, "a3" : 2},
   "c" : {"a2" : 3, "a4" : 3}
}
Run Code Online (Sandbox Code Playgroud)

我需要反向索引字典,在这种形式:

inverseDict = {
    "a1" : {"a" : 1},
    "a2" : {"b" : 1, "c" : 3},
    "a3" : {"b" : 2},
    "a4" : {"c" : 3}
}
Run Code Online (Sandbox Code Playgroud)

基本上

inverseDict = {dict.value.key : { dict.key : dict.value.value}}
Run Code Online (Sandbox Code Playgroud)

基本上,我需要将值的键作为键,将键作为值的键,同时将重复的新键等结果连接起来.

我试过这样做

ks = dict.keys()
vals = dict.values()

ks2 = vals.keys()
vals2 = vals.values()
Run Code Online (Sandbox Code Playgroud)

如果这有任何意义

但是我收到了一个错误

'dict_values' object has no attribute 'keys'
Run Code Online (Sandbox Code Playgroud)

根据我的理解,因为dict.values().keys().items()返回"views"而不是实际的元素本身,但我不知道如何解决这个问题.

还有一个我应该考虑的更有效的解决方案,因为我的实际dict非常大(~10k键),结果反转dict也会很大(> 3k键)

Jea*_*bre 6

使用collections.defaultdict(dict)和双循环相当容易:

d = {
    "a" : {"a1" : 1},
    "b" : {"a2" : 1, "a3" : 2},
    "c" : {"a2" : 3, "a4" : 3},
}

import collections

inverted = collections.defaultdict(dict)

for key,subd in d.items():
    for k,v in subd.items():  # no inspiration for key/value names...
        inverted[k][key] = v
Run Code Online (Sandbox Code Playgroud)

inverted

{'a1': {'a': 1},
 'a2': {'b': 1, 'c': 3},
 'a3': {'b': 2},
 'a4': {'c': 3}}
Run Code Online (Sandbox Code Playgroud)

使用defaultdictavoidids测试条目是否已存在并创建字典值(如果不存在).因此,只需按预期顺序无脑地添加键/值.

请注意,使用理解很难解决那些需要将项目处理成多个对象的问题.