重构嵌套字典Python

时间:2015-11-02 18:04:00

标签: python dictionary

我们说我有以下两个词典:

D1={'a':['a2','a3'], 'b':['b5','b7'], 'c':['c4']}
D2={'a':2, 'b':2, 'c':5}

我想重组它们,以便D2的值是嵌套D1项的键。基本上我想要以下字典:

DictIWant={2:{'a':['a2','a3'], 'b':['b5','b7']}, 5:{'c':['c4']}}

这样做的最佳和最有效的方法是什么?我偶然发现了一点,并且有一种非常笨重的方式来获得我想要的东西,但我认为学习正确的方法是很好的。

到目前为止,我的第一步是使用反向D2,如下所示:

>>> from collections import defaultdict
>>> D2_Inv = defaultdict(list)
>>> for k, v in D2.items():
...     D2_Inv[v].append(k)
... 
>>> D2_Inv=dict(D2_Inv)
>>> D2_Inv
{2: ['a', 'b'], 5: ['c']}

我对默认字典并不熟悉,但我从这个问题中找到了如何做到这一点:How to reverse a dictionary that it has repeated values (python)

然后,我一直在做以下事情:

>>> NextStep=defaultdict(list)
>>> for Key,Value in D2_Inv.items():
...     for SubValue in Value:
...         New= dict({SubValue: D1[SubValue]})
...         NextStep[Key].append(New)
... 
>>> NextStep=dict(NextStep)
>>> print NextStep
{2: [{'a': ['a2', 'a3']}, {'b': ['b5', 'b7']}], 5: [{'c': ['c4']}]}

也许是因为我不熟悉defaultdict,我不知道如何获取词典字典而不是字典列表字典。

那么我已经采取了最后一步来解决这个问题:

>>> DictIWant={}
>>> for k,v in NextStep.items():
...     F=v[0].copy()
...     for i in v[1:]:
...         F.update(i)
...     DictIWant[k]=F
... 
>>> print DictIWant
{2: {'a': ['a2', 'a3'], 'b': ['b5', 'b7']}, 5: {'c': ['c4']}}

我知道这是一种非常笨重的方式来获得我正在寻找的结果。有人可以提供更有效/正确的解决方案吗?

1 个答案:

答案 0 :(得分:3)

您可以使用collections.defaultdict(dict)简单地构建它。

from collections import defaultdict

D1={'a':['a2','a3'], 'b':['b5','b7'], 'c':['c4']}
D2={'a':2, 'b':2, 'c':5}

D3 = defaultdict(dict)

for k,v in D2.items():
    D3[v].update({k: D1[k]})

print(D3)
# defaultdict(<class 'dict'>, {2: {'b': ['b5', 'b7'], 'a': ['a2', 'a3']}, 5: {'c': ['c4']}})

由于子字母中的每个元素都是key: D1[key](wrt D2的键,值对),因此您使用defaultdict(dict)在{{1}引用可能的新字典然后用新元素更新它。

如果您宁愿避开D3[value]

,也可以使用dict.setdefault
defaultdict