3

让我们有一个以下字典:

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

考虑到值是唯一的,有没有办法有效地根据值查询键路径,或者使用值作为键来重建字典更好?

例子:

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

谢谢,

4

2 回答 2

5

“反转”字典的惯用方式是这样的:

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

如果您使用的是 Python 2 而不是 3,并且d可能很大,请iteritems改用。

在您的情况下,您有 a dictof dicts,并且如果我理解正确的话,您想将其双重反转为 a dictof 路径。但是你不知道怎么写。所以,让我们先明确地写出来,很长的路要走:

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

这是一个处理任意深度和“参差不齐”的字典的解决方案:

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 回答