2014-11-13 230 views
0

反向映射我有这个词典嵌套字典

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

而且我想将它变成这个字典

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

是否有这样做的一个非常简洁的方式?

+1

不,这是完全不可能的。 – Nearoo

回答

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'}} 
+0

这是一个非常整洁的解决方案。谢谢! – Jonathan

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'}}