在python中从JSON复制键并列出内容
我正试图浏览一本包含不对称数据的词典,并列出一些独特的标题。除了普通的键:值项之外,字典中的数据还包括其他字典、列表、字典列表、非类型等等。如果可能的话,我希望能够保持键/索引的层次结构。这将用于评估数据的范围及其可用性。数据来自JSON文件,其内容可能会发生更改 我最新的尝试是通过函数在python中从JSON复制键并列出内容,python,json,types,nested,iterable,Python,Json,Types,Nested,Iterable,我正试图浏览一本包含不对称数据的词典,并列出一些独特的标题。除了普通的键:值项之外,字典中的数据还包括其他字典、列表、字典列表、非类型等等。如果可能的话,我希望能够保持键/索引的层次结构。这将用于评估数据的范围及其可用性。数据来自JSON文件,其内容可能会发生更改 我最新的尝试是通过函数skim()中的一系列类型检查来实现这一点,如下所示 def skim(obj, header='', level=0): if obj is None: return def
skim()
中的一系列类型检查来实现这一点,如下所示
def skim(obj, header='', level=0):
if obj is None:
return
def skim_iterable(iterable):
lvl = level +1
if isinstance(iterable, (list, tuple)):
for value in iterable:
h = ':'.join([header, iterable.index(value)])
return skim(value, header=h, level=lvl)
elif isinstance(iterable, dict):
for key, value in iterable.items():
h = ':'.join([header, key])
return skim(value, header=h, level=lvl)
if isinstance(obj, (int, float, str, bool)):
return ':'.join([header, obj, level])
elif isinstance(obj, (list, dict, tuple)):
return skim_iterable(obj)
其目的是递归调用skim()
,直到传递最深级别的键或列表索引位置,然后返回skim
有一个内部函数,用于处理iterable对象,该对象通过每个嵌套的iterable对象向前传递级别以及键值或列表索引位置
下面是一个例子
test = {"level_0Item_1": {
"level_1Item_1": {
"level_2Item_1": "value",
"level_2Item_2": "value"
},
"level_1Item_2": {
"level_2Item_1": "value",
"level_2Item_2": {}
}},
"level_0Item_2": [
{
"level_1Item_1": "value",
"level_1Item_2": 569028742
}
],
"level_0Item_3": []
}
collection = [skim(test)]
现在,我得到了关于上述代码的[None]
的回复,并希望得到一些关于如何最好地解决此问题的帮助和指导。我所期待的是这样的:
['level_0Item_1:level_1Item_1:level_2Item_1',
'level_0Item_1:level_1Item_1:level_2Item_2',
'level_0Item_1:level_1Item_2:level_2Item_1',
'level_0Item_1:level_1Item_2:level_2Item_2',
'level_0Item_2:level_1Item_1',
'level_0Item_2:level_1Item_2',
'level_0Item_3]
在其他资源中,我最近遇到了这个问题),读了它,它包含了参考资料。这里完全公开,我最近才开始编码
谢谢您的帮助。您可以尝试以下方法:
def skim(obj, connector=':', level=0, builded_str= ''):
if isinstance(obj, dict):
for k, v in obj.items():
if isinstance(v, dict) and v:
yield from skim(v, connector, level + 1, builded_str + k + connector)
elif isinstance(v, list) and v:
yield from skim(v[0], connector, level + 1, builded_str + k + connector)
else:
yield builded_str + k
else:
yield builded_str
测试:
您可以尝试以下方法:
def skim(obj, connector=':', level=0, builded_str= ''):
if isinstance(obj, dict):
for k, v in obj.items():
if isinstance(v, dict) and v:
yield from skim(v, connector, level + 1, builded_str + k + connector)
elif isinstance(v, list) and v:
yield from skim(v[0], connector, level + 1, builded_str + k + connector)
else:
yield builded_str + k
else:
yield builded_str
测试: