3

次の口述をしましょう:

 table = {x1: {y1: 1, y2:2},
         x2: {y1: 3, y2:4},
         x3: {y3: 5, y2:6}
         } 

値が一意であることを考慮して、値に基づいてキーパスを効率的にクエリする方法はありますか、それとも値をキーとして使用してdictを再構築する方が良いですか?

例:

   result = magic_function(table, 3)
   result --> [x2, y1]

ありがとう、

4

2 に答える 2

5

辞書を「反転」する慣用的な方法は次のようになります。

i = {v: k for (k, v) in d.items()}

3ではなくPython2を使用していdて、大きい可能性がある場合は、iteritems代わりに使用してください。

あなたの場合、あなたはのを持っていますdict、そしてあなたは私が正しく理解しているなら、それをパスののdictsように二重に反転させたいです。dictしかし、あなたはそれを書く方法を知りません。それで、長い道のりで、それを明示的に書くことから始めましょう:

i = {}
for k, v in d.items():
    for k2, v2 in v.items():
        i[v2] = (k, k2)

これを辞書の理解に変換することはできますが、考えずにコピーして貼り付ける魔法の呼び出しではなく、実際に理解できるものにしたいので、その部分はあなたに任せます(ただし、喜んでご不明な点がございましたら、お気軽にお問い合わせください)。

于 2013-01-04T23:21:40.590 に答える
2

反転するのがおそらくより良い方法です:

In [17]: d = {table[k1][k2]: (k1,k2) for k1 in table for k2 in table[k1]}

これは、任意の深さと「不規則な」dictを処理するソリューションです。

def invert_arbitrary(d, ldict, p=[]):
    for k, v in ldict.items():
        if isinstance(v, dict):
            invert_arbitrary(d, v, p + [k])
        else:
            d[v] = p + [k]

例:

table = {'x1': {'y1': 1, 'y2': 2}, 
         'x2': {'y1': 3,
                'y2': {'z1': 4, 'z2': 5}},
         'x3': 6}

In [40]: d = dict()
In [41]: invert_arbitrary(d, table)

In [42]: d
Out[42]: 
{1: ['x1', 'y1'],
 2: ['x1', 'y2'],
 3: ['x2', 'y1'],
 4: ['x2', 'y2', 'z1'],
 5: ['x2', 'y2', 'z2'],
 6: ['x3']}
于 2013-01-04T23:23:22.173 に答える