Если мои данные JSON выглядят так:
{
"name": "root",
"children": [
{
"name": "a",
"children": [
{
"name": "b",
"children": [
{
"name": "c",
"size": "1"
},
{
"name": "d",
"size": "2"
}
]
},
{
"name": "e",
"size": 3
}
]
},
{
"name": "f",
"children": [
{
"name": "g",
"children": [
{
"name": "h",
"size": "1"
},
{
"name": "i",
"size": "2"
}
]
},
{
"name": "j",
"size": 5
}
]
}
]
}
Как я могу вернуть два соседних уровня в Python?
Например, возврат:
а - б, e
f - g, j
Данные могут стать очень большими, поэтому мне придется разрезать их на более мелкие части.
Спасибо за любую помощь.
Вы понимаете, что JSON - это обозначение, и его анализ / загрузка дает вам обычные контейнеры и значения Python? Вы знаете, как нарезать / индексировать список Python и типы dict?
Я использовал json.loads () для создания вложенного dict, но я застрял в ссылке на определенные данные. Я попытался использовать несколько циклов for, но не смог заставить его работать и подумал, что могут быть лучшие решения. (Извините, я новичок в Python, а также в Stackoverflow)
Какая структура данных вам нужна в конце? То, что вы показали, не является действительной структурой данных Python. Должно ли bˋ также содержать ˋcˋ и ˋdˋ, т.е. вы просто хотите удалить ключи «имя» и «дети»? А что насчет поля «размер»?
В конце концов, мне нужен dict, содержащий всю информацию, указанную, например, в исходных данных (имя, дети, размер). Я хочу использовать его в качестве входных данных для компонента (диаграмма солнечных лучей), который основан на компоненте D3.
Попробуйте это решение, скажите, работает оно или нет.
dictVar = {
"name": "root",
"children": [
{
"name": "a",
"children": [
{
"name": "b",
"children": [
{
"name": "c",
"size": "1"
},
{
"name": "d",
"size": "2"
}
]
},
{
"name": "e",
"size": 3
}
]
},
{
"name": "f",
"children": [
{
"name": "g",
"children": [
{
"name": "h",
"size": "1"
},
{
"name": "i",
"size": "2"
}
]
},
{
"name": "j",
"size": 5
}
]
}
]
}
name = {}
for dobj in dictVar['children']:
for c in dobj['children']:
if not dobj['name'] in name:
name[dobj['name']] = [c['name']]
else:
name[dobj['name']].append(c['name'])
print(name)
И поскольку вам нужны все данные о происхождении, то другой:
name = {}
for dobj in dictVar['children']:
for c in dobj['children']:
if not dobj['name'] in name:
name[dobj['name']] = [c]
else:
name[dobj['name']].append(c)
print(name)
Вам нужно построить дерево dict
со значениями в виде листьев:
{'a': {'b': {'c': '1', 'd': '2'}, 'e': '3'}, 'f': {'g': {'h': '1', 'i': '2'}, 'j': '5'}}
Это можно разделить на три отдельных действия:
"name"
узла для использования в качестве ключа"children"
, преобразуйте их в dict
"size"
, преобразуйте его в одно значениеЕсли ваши данные не являются глубоко вложенными, рекурсия - это простой подход:
def compress(node: dict) -> dict:
name = node['name'] # get the name
try:
children = node['children'] # get the children...
except KeyError:
return {name: node['size']} # or return name and value
else:
data = {}
for child in children: # collect and compress all children
data.update(compress(child))
return {name: data}
Это сжимает всю иерархию, включая узел "root"
:
>>> compress(data)
{'root': {'a': {'b': {'c': '1', 'd': '2'}, 'e': 3},
'f': {'g': {'h': '1', 'i': '2'}, 'j': 5}}}
Расскажите что ты пробовал, а где вы застряли. Это также поможет нам лучше ответить на ваш вопрос.