Python 反转嵌套字典
我想把一个嵌套的字典里的值反转一下。
比如说:
input = { "a" : { "x": 2, "y": 3 },
"b" : { "x": 5, "z": 7 } }
output = {'y': {'a': 3},
'x': {'a': 2, 'b': 5},
'z': {'b': 7} }
我现在拥有的是:
def reverse_nest_dicts(nested_dict):
reverse_nest_dict = {}
for k, v in nested_dict:
for k2, v2 in nested_dict.values():
reverse_nest_dict[k2][k] = v2
return reverse_nest_dict
5 个回答
1
字典的 items() 和 setdefault() 方法 可以很轻松地解决这类问题:
>>> input = { "a" : { "x": 2, "y": 3 },
"b" : { "x": 5, "z": 7 } }
>>> result = {}
>>> for k1, subdict in input.items():
for k2, v in subdict.items():
result.setdefault(k2, {})[k1] = v
>>> result
{'y': {'a': 3}, 'x': {'a': 2, 'b': 5}, 'z': {'b': 7}}
在Python 2中,使用 iteritems() 替代 items() 可以稍微提高一点速度。
同样,使用 collections.defaultdict(dict) 也比使用 setdefault 快一点。不过,这样做会返回一个defaultdict,而不是你问题中提到的普通字典。
1
你的函数有三个不同的错误。下面是你需要的内容:
def reverse_nest_dicts(nested_dict):
reverse_nest_dict = {}
for k, v in nested_dict.iteritems():
for k2, v2 in v.iteritems():
try:
reverse_nest_dict[k2][k] = v2
except KeyError:
reverse_nest_dict[k2] = { k : v2 }
return reverse_nest_dict
错误如下:
第一个循环:你用字典作为循环的对象,这样只会得到键(key),而你想要的是(键,值)对,所以需要使用 items() 或 iteritems()。
第二个循环:循环的对象应该是嵌套的字典,而不是外层的字典。
在你尝试访问 reverse_nest_dict 的值之前,需要先把它们初始化为内部字典。
2
for k2, v2 in nested_dict.values():
应该是
for k2, v2 in v.items():
(另外,如果你在使用Python 2.x,使用.iteritems()
可能会更高效,而不是.items()
。)
你还需要确保子字典已经初始化——你可以通过使用defaultdict
来做到这一点...
from collections import defaultdict
reverse_nest_dict = defaultdict(dict)
...或者使用setdefault
:
reverse_nest_dict.setdefault(k2, {})[k] = v2