在Python中,在嵌套字典中交换键顺序的有效方法是什么?

2024-09-28 03:21:46 发布

您现在位置:Python中文网/ 问答频道 /正文

很抱歉我的题目很复杂,但这里有一个例子来说明我的意思。你知道吗

变换

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

进入

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

注意InnerKey,OuterKey对与值的关联是如何保持的,但是它们的顺序只是颠倒了。我们以前使用mydictionary[OuterKey][InnerKey]访问Value1,现在使用newdictionary[InnerKey][OuterKey]访问它。你知道吗

实现这一点的直接方法是通过第一个dictionary重新创建两个嵌套循环,然后每次构建一个元素来构建第二个dictionary。 然而,我想知道是否有一个更干净的/更python的方法来做到这一点,比如列表理解。你知道吗

更新:似乎对期望的输出有一些混淆。特别是,在转换之后,OuterKey应该映射到哪个值,这是一个混乱的问题。 答案是前一个外键(现在是内键)应该映射到前一个内键(现在是外键)映射到的相同值。你知道吗


Tags: 方法dictionary外键value1value2value3value4mydictionary
2条回答

在本例中,我发现在循环中使用setdefault(或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

像这样:

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

相关问题 更多 >

    热门问题