我们说我有以下两个词典:
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']}}
我知道这是一种非常笨重的方式来获得我正在寻找的结果。有人可以提供更有效/正确的解决方案吗?
答案 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