让我们有一个以下字典:
table = {x1: {y1: 1, y2:2},
x2: {y1: 3, y2:4},
x3: {y3: 5, y2:6}
}
考虑到值是唯一的,有没有办法有效地根据值查询键路径,或者使用值作为键来重建字典更好?
例子:
result = magic_function(table, 3)
result --> [x2, y1]
谢谢,
让我们有一个以下字典:
table = {x1: {y1: 1, y2:2},
x2: {y1: 3, y2:4},
x3: {y3: 5, y2:6}
}
考虑到值是唯一的,有没有办法有效地根据值查询键路径,或者使用值作为键来重建字典更好?
例子:
result = magic_function(table, 3)
result --> [x2, y1]
谢谢,
“反转”字典的惯用方式是这样的:
i = {v: k for (k, v) in d.items()}
如果您使用的是 Python 2 而不是 3,并且d
可能很大,请iteritems
改用。
在您的情况下,您有 a dict
of dicts
,并且如果我理解正确的话,您想将其双重反转为 a dict
of 路径。但是你不知道怎么写。所以,让我们先明确地写出来,很长的路要走:
i = {}
for k, v in d.items():
for k2, v2 in v.items():
i[v2] = (k, k2)
您可以将其转换为字典理解,但您希望它是您真正理解的东西,而不是您不假思索地复制和粘贴的某种魔术调用,所以我将这部分留给您(但我很乐意如果您有任何问题,请提供帮助)。
反转可能是更好的方法:
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']}