Как я могу получить определенные уровни JSON в Python?

Если мои данные 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

Данные могут стать очень большими, поэтому мне придется разрезать их на более мелкие части.

Спасибо за любую помощь.

Расскажите что ты пробовал, а где вы застряли. Это также поможет нам лучше ответить на ваш вопрос.

SSC 18.12.2018 08:18

Вы понимаете, что JSON - это обозначение, и его анализ / загрузка дает вам обычные контейнеры и значения Python? Вы знаете, как нарезать / индексировать список Python и типы dict?

MisterMiyagi 18.12.2018 08:35

Я использовал json.loads () для создания вложенного dict, но я застрял в ссылке на определенные данные. Я попытался использовать несколько циклов for, но не смог заставить его работать и подумал, что могут быть лучшие решения. (Извините, я новичок в Python, а также в Stackoverflow)

simeck 18.12.2018 08:39

Какая структура данных вам нужна в конце? То, что вы показали, не является действительной структурой данных Python. Должно ли bˋ также содержать ˋcˋ и ˋdˋ, т.е. вы просто хотите удалить ключи «имя» и «дети»? А что насчет поля «размер»?

MisterMiyagi 18.12.2018 08:39

В конце концов, мне нужен dict, содержащий всю информацию, указанную, например, в исходных данных (имя, дети, размер). Я хочу использовать его в качестве входных данных для компонента (диаграмма солнечных лучей), который основан на компоненте D3.

simeck 18.12.2018 08:47
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
321
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуйте это решение, скажите, работает оно или нет.

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'}}

Это можно разделить на три отдельных действия:

  1. получить "name" узла для использования в качестве ключа
  2. если на узле есть "children", преобразуйте их в dict
  3. если на узле есть "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}}}

Другие вопросы по теме