嵌套字典上的反向映射

时间:2014-11-13 19:07:01

标签: python dictionary

我有这本词典

{
    'eth1': {
            'R2': bw1,
            'R3': bw3
            },
    'eth2': {
            'R2': bw2,
            'R3': bw4
        }
}

我想把它变成这本词典

{
    'R2': {
        'eth1': bw1,
        'eth2': bw2,
    },
    'R3': {
        'eth1': bw3,
        'eth2': bw4
    }
}

有没有一种巧妙的方法呢?

2 个答案:

答案 0 :(得分:1)

您可以使用嵌套循环浏览字典,并使用setdefault更新键/值来构建新字典。

d={
    'eth1': {
            'R2': 'bw1',
            'R3': 'bw3'
            },
    'eth2': {
            'R2': 'bw2',
            'R3': 'bw4'
        }
}
result = {} 
for k, v in d.iteritems():
    for a,b in v.iteritems():
        result.setdefault(a, {}).update({k:b})
print result

输出:

{'R2': {'eth2': 'bw2', 'eth1': 'bw1'}, 'R3': {'eth2': 'bw4', 'eth1': 'bw3'}}

您可以在列表推导中使用嵌套循环来编写较小的解决方案,并且它会产生相同的结果。

result = {} 
res= [result.setdefault(a, {}).update({k:b}) for k, v in d.iteritems() for a,b in v.iteritems()]
print result 

#Output: {'R2': {'eth2': 'bw2', 'eth1': 'bw1'}, 'R3': {'eth2': 'bw4', 'eth1': 'bw3'}}

答案 1 :(得分:0)

不确定为什么要投票,这不是一件容易的事。像这样的老实说嵌套词典是PITA。这将有效:

d1 = {
    'eth1': {
            'R2': bw1,
            'R3': bw3
            },
    'eth2': {
            'R2': bw2,
            'R3': bw4
        }
}

>>> d2 = {}
>>> for k1, v1 in d1.items():
...   for k2, v2 in v1.items():
...     if k2 not in d2:
...       d2[k2] = {}
...     d2[k2][k1] = v2
... 
>>> d2
{'R2': {'eth2': 'bw2', 'eth1': 'bw1'}, 'R3': {'eth2': 'bw4', 'eth1': 'bw3'}}