gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:38:30 27 4
gpt4 key购买 nike

我有一本这样的字典:

{
"id": "abcde",
"key1": "blah",
"key2": "blah blah",
"nestedlist": [
{
"id": "qwerty",
"nestednestedlist": [
{
"id": "xyz",
"keyA": "blah blah blah"
},
{
"id": "fghi",
"keyZ": "blah blah blah"
}
],
"anothernestednestedlist": [
{
"id": "asdf",
"keyQ": "blah blah"
},
{
"id": "yuiop",
"keyW": "blah"
}
]
}
]
}

基本上是一个包含任意深度的嵌套列表、字典和字符串的字典。

遍历它以提取每个“id”键的值的最佳方法是什么?我想实现类似“//id”之类的 XPath 查询。 “id”的值始终是一个字符串。

所以从我的例子来看,我需要的输出基本上是:

["abcde", "qwerty", "xyz", "fghi", "asdf", "yuiop"]

顺序并不重要。

最佳答案

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

所以我通过 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) 是我从这里的函数改编的函数,实际上它很像 Alfe 的 find 函数,主要区别在于,我正在检查给定对象是否具有 iteritems 函数,以防在递归期间传递字符串:

# python 2
def gen_dict_extract(key, var):
if hasattr(var,'iteritems'): # hasattr(var,'items') for python 3
for k, v in var.iteritems(): # var.items() for python 3
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 之外的其余部分彼此接近。 funkeyHole 函数仅在您查找字符串时才起作用。

这里有有趣的学习方面:)

关于python - 在嵌套字典和列表中查找所有出现的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9807634/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com