让我们有一个下面的词:
table = {x1: {y1: 1, y2:2},
x2: {y1: 3, y2:4},
x3: {y3: 5, y2:6}
}
考虑到值是唯一的,有没有办法根据值有效地查询关键路径,或者最好使用值作为关键字来重建字典?
示例:
result = magic_function(table, 3)
result --> [x2, y1]
谢谢,
答案 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']}