Python 反转嵌套字典

4 投票
5 回答
1833 浏览
提问于 2025-04-17 13:52

我想把一个嵌套的字典里的值反转一下。

比如说:

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

撰写回答