我有一本这样的字典:
{ "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非常有趣,因为它为同一问题提供了几种不同的解决方案。我采用了所有这些功能,并使用一个复杂的字典对象对其进行了测试。我必须从测试中删除两个函数,因为它们必须有很多失败结果,并且它们不支持将返回列表或dict作为值,我认为这是必不可少的,因为应该为即将出现的
所有 数据准备一个函数。
因此,我通过该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)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
所有函数都使用相同的指针进行搜索(“记录”)和相同的字典对象,其结构如下:
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)
是我从此处的函数改编而成的函数,实际上,它find
与Alfe的函数非常相似,主要区别在于,如果递归期间传递了字符串,则我要检查给定对象是否具有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
唯一的工作,如果你正在寻找的字符串。
这里有趣的学习方面:)
问题内容: 我有以下格式的字典: 演示代码: 我无法获得嵌套字典在内存中的存储方式,因为size如果是136个字节,size是80个字节,而且size是520个字节。 另外,当我对类型从到的变量数据进行类型转换时,字符串变量的大小为。 演示代码: 可以解释一下为什么吗? 问题答案: 字典和列表存储 引用 (类似于Python中的其他所有标准容器)。不遵循引用,它给你的C结构的内存占用 唯一 。引用
问题内容: 我正在处理一个复杂的嵌套字典和列表数据结构。我需要将数据展平并将所有嵌套项都置于0级。有关更多说明,请参见以下示例: 我需要将其展平为: 我从这篇文章的第一个答案中获得了参考,但是只有在我嵌套了字典的情况下它才可以工作,如果列表嵌套在字典中并且更多的词典嵌套在这些列表中,则它不能工作。 我对代码做了一些修改以适合我的用例,但是此代码不起作用 当我在此处粘贴代码时,缩进变得混乱。但我真的
本文向大家介绍python实现字典嵌套列表取值,包括了python实现字典嵌套列表取值的使用技巧和注意事项,需要的朋友参考一下 如下所示: 访问dict的值: 访问dict下的result列表的值: 也可以使用临时变量: 以上这篇python实现字典嵌套列表取值就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。
问题内容: 我有类似的东西 并且需要具有: 非常感谢! 编辑:我想按subkey1进行排序,这之前还不清楚。 问题答案: 使用关键字表示功能和方法: 演示: 假定 所有 顶级词典都具有一个键,该键被假定为带有键的字典。 有关更多详细信息和技巧,请参见Python Sorting HOWTO 。
问题内容: 我试图遍历字典并打印出所有值不是嵌套字典的键值对。如果值是字典,我想进入它并打印出它的键值对…等等。有什么帮助吗? 这个怎么样?它仍然只打印一件事。 完整的测试用例 字典: 结果: 问题答案: 如Niklas所说,你需要递归,即你想定义一个函数来打印你的字典,如果值是一个dict,则想使用这个新字典来调用你的打印函数。 就像是 : 或从Python 3开始:
我有一个JSON API响应,如下所示: 我正在使用Python并尝试访问响应中的第一个“下载”值。所以我需要从sales\u list(目录中的列表)开始 我见过关于在列表中的字典或嵌套字典中访问值的问题。但是我对如何在字典中的列表和列表中的字典之间/之间导航有点困惑。任何帮助都将不胜感激。