Извлечение полей в динамически вложенном словаре упорядоченным образом

учитывая следующий словарь, который является динамическим, поэтому может быть любой уровень глубины (вложенная структура):

data = {
    "level": {
        "system": {
            "text": "A Lorem ipsum colour."
        },
        "board": {
            "core": {
                "text": "Another one."
            }
        }
    },
    "peer": {
        "core": {
            "text": "B Lorem ipsum colour."
        },
        "main": {
            "text": "C Lorem ipsum colour."
        }
    }
}

Цель состоит в том, чтобы извлечь упорядоченные элементы text (сверху вниз), результат должен быть примерно таким:

result = "A Lorem ipsum colour. Another one. B Lorem ipsum colour. C Lorem ipsum colour.

Я думаю, что мне нужно использовать какой-то тип рекурсии, но я не могу его получить. Что я получаю до сих пор - и что не работает - это следующее:

for k, v in data.items():
    if isinstance(v, dict):
        # i think i have to continue here on a deeper recursion level
    else:
        return v["text"]

С наилучшими пожеланиями

Отвечает ли это на ваш вопрос? Найти все вхождения ключа во вложенных словарях и списках

sahasrara62 10.04.2022 15:33
return ' '.join(map(myfunc, v.values())) — это рекурсия, которую вы хотите, но ваш базовый случай не совсем правильный, поскольку, если v не является диктом, вы не можете получить его text.
Samwise 10.04.2022 15:34
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
0
2
21
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий
def dict_value(val: dict):
    for key, item in val.items():
        if type(item) == dict:
            dict_value(item)
        else:
            print(item)


dict_value(data)

Это работает для приведенных выборочных данных. Однако это работает только в этом случае, потому что «текстовые» клавиши находятся на самом низком уровне в структуре. Если бы в словаре были какие-либо другие ключи, значения которых не были словарями, они также были бы напечатаны. Это также не дает указанного вывода. Тем не менее, это принятый ответ

Lancelot du Lac 10.04.2022 16:21

Чтобы получить результат, как указано в исходном вопросе:

data = {
    "level": {
        "system": {
            "text": "A Lorem ipsum colour."
        },
        "board": {
            "core": {
                "text": "Another one."
            }
        }
    },
    "peer": {
        "core": {
            "text": "B Lorem ipsum colour."
        },
        "main": {
            "text": "C Lorem ipsum colour."
        }
    }
}

def get_text(d, lst):
    for k, v in d.items():
        if isinstance(v, dict):
            get_text(v, lst)
        elif k == 'text':
            lst.append(v)
    return lst


print(' '.join(get_text(data, [])))

Выход:

A Lorem ipsum colour. Another one. B Lorem ipsum colour. C Lorem ipsum colour.

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