我有一本这样的字典:
{ "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"]
秩序并不重要。
编辑:@Anthon注意到这对直接嵌套的列表不起作用。如果您的输入中包含此项,则可以使用此项:
但我觉得原版比较容易理解,所以我就不写了。
我发现这个Q/A非常有趣,因为它为同一个问题提供了几种不同的解决方案。我取了所有这些函数,并用一个复杂的dictionary对象测试它们。我不得不将两个函数从测试中取出,因为它们必须有许多失败的结果,而且它们不支持将列表或dict作为值返回,我认为这是必要的,因为一个函数应该为几乎所有的数据做好准备。
所以我在100.000次迭代中通过
timeit
模块泵送了其他函数,结果如下:所有函数都有相同的指针来搜索('logging')和相同的dictionary对象,其结构如下:
所有函数都提供了相同的结果,但时间差异是戏剧性的!函数
gen_dict_extract(k,o)
是我从这里的函数改编而来的函数,实际上它非常类似于Alfe的find
函数,主要区别在于,我检查给定的对象是否有iteritems函数,以防在递归过程中传递字符串:所以这个变种是这里最快最安全的函数。而
find_all_items
的速度非常慢,与第二慢的get_recursivley
相差很远,而除dict_extract
外,其余的都很近。函数fun
和keyHole
仅在查找字符串时才起作用。有趣的学习方面:)
相关问题 更多 >
编程相关推荐