python字典列表中查找_在嵌套的python字典和列表中查找所有出现的键

这篇博客对比了多种在Python字典列表中查找键的解决方案,通过性能测试发现gen_dict_extract函数在100,000次迭代中的速度最快,而find_all_items函数表现最慢。文章还提供了测试用例和函数实现,强调在处理复杂数据结构时选择正确算法的重要性。" 79971459,7394692,SpringBoot自定义配置与编码格式设置详解,"['SpringBoot', '配置管理', '编码设置', 'Java开发']
摘要由CSDN通过智能技术生成

我发现这个Q/A非常有趣,因为它为同一个问题提供了几种不同的解决方案。我取了所有这些函数,并用一个复杂的dictionary对象测试它们。我不得不将两个函数从测试中取出,因为它们必须有许多失败的结果,而且它们不支持将列表或dict作为值返回,我认为这是必要的,因为一个函数应该为几乎所有的数据做好准备。

所以我在100.000次迭代中通过timeit模块泵送了其他函数,结果如下:0.11 usec/pass on gen_dict_extract(k,o)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -

6.03 usec/pass on find_all_items(k,o)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -

0.15 usec/pass on findkeys(k,o)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -

1.79 usec/pass on get_recursively(k,o)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -

0.14 usec/pass on find(k,o)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -

0.36 usec/pass on dict_extract(k,o)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -

所有函数都有相同的指针来搜索('logging')和相同的dictionary对象,其结构如下:o = { 'temparature': '50',

'logging': {

'handlers': {

'console': {

'formatter': 'simple',

'class': 'logging.StreamHandler',

'stream': 'ext://sys.stdout',

'level': 'DEBUG'

}

},

'loggers': {

'simpleExample': {

'handlers': ['console'],

'propagate': 'no',

'level': 'INFO'

},

'root': {

'handlers': ['console'],

'level': 'DEBUG'

}

},

'version': '1',

'formatters': {

'simple': {

'datefmt': "'%Y-%m-%d %H:%M:%S'",

'format': '%(asctime)s - %(name)s - %(levelname)s - %(message)s'

}

}

},

'treatment': {'second': 5, 'last': 4, 'first': 4},

'treatment_plan': [[4, 5, 4], [4, 5, 4], [5, 5, 5]]

}

所有函数都提供了相同的结果,但时间差异是戏剧性的!函数gen_dict_extract(k,o)是我从这里的函数改编而来的函数,实际上它非常类似于Alfe的find函数,主要区别在于,我检查给定的对象是否有iteritems函数,以防在递归过程中传递字符串:def gen_dict_extract(key, var):

if hasattr(var,'iteritems'):

for k, v in var.iteritems():

if k == key:

yield v

if isinstance(v, dict):

for result in gen_dict_extract(key, v):

yield result

elif isinstance(v, list):

for d in v:

for result in gen_dict_extract(key, d):

yield result

所以这个变种是这里最快最安全的函数。而find_all_items的速度非常慢,与第二慢的get_recursivley相差很远,而除dict_extract外,其余的都很近。函数fun和keyHole仅在查找字符串时才起作用。

有趣的学习方面:)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值