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

我发现这个Q / A非常有趣,因为它为同样的问题提供了几种不同的解决方案。我使用了所有这些函数并使用复杂的字典对象对其进行了测试。我不得不从测试中取出两个函数,因为它们必须有许多失败结果,并且它们不支持返回列表或dicts作为值,这是我认为必不可少的,因为应该为几乎任何数据准备函数。

所以我通过timeit模块在100.000次迭代中抽取其他函数,输出结果如下:

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')和相同的字典对象,其构造如下:

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)是我的函数改编自这里的函数,实际上它非常类似于findAlfe 的函数,主要区别在于,我检查给定对象是否具有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、付费专栏及课程。

余额充值