0

为令人费解的问题标题道歉,但这是我的意思的一个例子。

转换

mydictionary = {"OuterKey1": {"InnerKey1": "Value1", "InnerKey2": "Value2"}, 
                "OuterKey2": {"InnerKey1": "Value3", "InnerKey2": "Value4"}}

进入

newdictionary = {"InnerKey1" : {"OuterKey1" : "Value1", "OuterKey2" : "Value3"},
                 "InnerKey2" : {"OuterKey1" : "Value2", "OuterKey2" : "Value4"}}

注意InnerKey,OuterKeypair 与值的关联是如何保留的,但它们的顺序只是颠倒了。我们以前Value1使用mydictionary[OuterKey][InnerKey]访问的地方,现在使用newdictionary[InnerKey][OuterKey].

实现此目的的直接方法是通过第一个字典重新创建两个嵌套循环,并一次构建第二个字典一个元素。但是,我想知道是否有更清洁/更 Pythonic 的方式来做到这一点,例如使用列表推导。

更新:似乎对所需的输出有些混淆。特别是,在转换后 OuterKey 应该映射到哪个值存在混淆。答案是之前的外键(现在的内键)应该映射到与之前的内键(现在的外键)映射到的相同的值。

4

2 回答 2

7

在这种情况下,我发现 using setdefaultin a loop (或 a defaultdict)比理解更易读。毕竟,“可读性很重要......”:

mydictionary = {"OuterKey1": {"InnerKey1": "Value1", "InnerKey2": "Value2"}, "OuterKey2": {"InnerKey1": "Value3", "InnerKey2": "Value4"}}
d = {}
for k, v in mydictionary.items():
    for ik, iv in v.items():
            d.setdefault(ik, {})[k] = iv

# result:
# d == {'InnerKey2': {'OuterKey2': 'Value4', 'OuterKey1': 'Value2'}, 'InnerKey1': {'OuterKey2': 'Value3', 'OuterKey1': 'Value1'}}

同样使用defaultdict

from collections import defaultdict
d = defaultdict(dict)
for k, v in mydictionary.items():
    for ik, iv in v.items():
            d[ik][k] = iv
于 2013-07-24T06:47:49.530 回答
1

像这样:

>>> mydictionary = {"OuterKey1": {"InnerKey1": "Value1", "InnerKey2": "Value2"}, 
...                 "OuterKey2": {"InnerKey1": "Value3", "InnerKey2": "Value4"}}
>>> dict([(k, dict([(k2,mydictionary[k2][k]) for k2 in mydictionary]))
...     for k  in mydictionary.values()[0]])
{'InnerKey2': {'OuterKey2': 'Value4', 'OuterKey1': 'Value2'}, 
 'InnerKey1': {'OuterKey2': 'Value3', 'OuterKey1': 'Value1'}}
于 2013-07-24T06:29:05.073 回答