3

例如,我想使用嵌套字典并反转值

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
4

4 回答 4

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
于 2013-01-28T01:17:27.557 回答
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

错误是:

  • 第一个 for 循环:使用字典作为循环序列只会产生键,你想要 (key,value) 所以需要使用 items() 或 iteritems()

  • 第二个for循环:循环序列应该是嵌套字典,而不是外部字典

  • 在尝试访问它们之前,您需要将 reverse_nest_dict 值初始化为内部字典。

于 2013-01-28T01:27:07.053 回答
0

字典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 而不是您问题中指定的 dict。

于 2013-01-28T02:09:02.073 回答
0

如果字典太大,检查https://stackoverflow.com/a/47151034/676214

如果您只想访问反向嵌套字典,如果字典太大而无法反转,请节省内存。

class mdict2(dict):
    def __init__(self, parent, key1):
        self.parent = parent
        self.key1 = key1

    def __getitem__(self, key2):
        return self.parent.mirror[key2][self.key1]


class mdict(dict):
    def __init__(self, mirror):
        self.mirror = mirror

    def __getitem__(self, key):
        return mdict2(self, key)

d0 = {
 'Bob' : {'item1':3, 'item2':8, 'item3':6},
 'Jim' : {'item1':6, 'item4':7},
 'Amy' : {'item1':6,'item2':5,'item3':9,'item4':2}
}
d1 = mdict(d0)

d0['Amy']['item1'] == d1['item1']['Amy']
# True
于 2017-11-07T06:10:47.317 回答