python字典创建查找_Python – 在嵌套字典中查找特定值的父键

除非你只是进行一次搜索(或者你在内存上受到极大的限制,但有时间需要刻录…),否则你需要构建一个反向查找字典,然后就可以使用它了.

为了使这更容易,我将分两步完成.首先,将嵌套字典转换为键路径字典:

def keypaths(nested):

for key, value in nested.iteritems():

if isinstance(value, collections.Mapping):

for subkey, subvalue in keypaths(value):

yield [key] + subkey, subvalue

else:

yield [key], value

打印列表(keypaths(example_dict))如果不明显这是什么.

现在,您如何创建反向字典?对于一对一映射,您可以这样做:

reverse_dict = {value: keypath for keypath, value in keypaths(example_dict)}

但是对于像你这样的多对一映射,反之亦然是一对多,所以我们需要将每个值映射到一个键列表.所以:

reverse_dict = {}

for keypath, value in keypaths(example_dict):

reverse_dict.setdefault(value, []).append(keypath)

而现在你不需要任何花哨的东西;只需在reverse_dict上执行正常的dict查找:

>>> reverse_dict['value2']

[('key2',)]

>>> reverse_dict['value1']

[('key1',), ('key4', 'key4a', 'key4ac')]

>>> reverse_dict['value3']

KeyError: 'value3'

如果您希望最后一个返回[]而不是引发KeyError,则可以使用defaultdict(list)而不是普通dict,然后您不需要setdefault.

无论如何,构建这种反向映射所花费的时间只比通过强力进行单次搜索所花费的时间稍长一些,所以如果你进行100次搜索,它的速度将快几百倍,就像更简单.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值