python查询基于值的字典中的键

时间:2013-01-04 23:07:43

标签: python dictionary

让我们有一个下面的词:

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

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

示例:

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

谢谢,

2 个答案:

答案 0 :(得分:5)

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

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

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

在您的情况下,您已获得dict dicts,如果我理解正确,您希望将其双重转换为dict个路径。但是你不知道怎么写。所以,让我们明确地写一下,很长的路要走:

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

你可以把它转换成字典理解,但你希望它是你真正理解的东西,而不是你不经思考地复制和粘贴的魔法调用,所以我会把那部分留给你(但我和如果你有任何问题,我会很乐意提供帮助。)

答案 1 :(得分: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']}