0

複雑な質問タイトルで申し訳ありませんが、これが私が言いたいことの例です。

変身

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

の中へ

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

InnerKey,OuterKeyペアと値の関連付けは保持されていますが、順序が逆になっていることに注意してください。以前は を使用してアクセスしていた場所に、 をValue1使用しmydictionary[OuterKey][InnerKey]てアクセスしnewdictionary[InnerKey][OuterKey]ます。

これを実現する直接的な方法は、最初のディクショナリを介して 2 つのネストされたループを再作成し、2 番目のディクショナリを一度に 1 要素ずつ構築することです。ただし、リスト内包表記など、よりクリーンでより Pythonic な方法があるのではないかと思います。

更新: 目的の出力について混乱があるようです。特に、変換後に OuterKey をマップする必要がある値について混乱があります。答えは、以前の外部キー (現在の内部キー) は、以前の内部キー (現在の外部キー) がマップされたのと同じ値にマップする必要があるということです。

4

2 に答える 2

7

この場合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
于 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 に答える