учитывая следующий словарь, который является динамическим, поэтому может быть любой уровень глубины (вложенная структура):
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"]
С наилучшими пожеланиями
return ' '.join(map(myfunc, v.values()))
— это рекурсия, которую вы хотите, но ваш базовый случай не совсем правильный, поскольку, если v
не является диктом, вы не можете получить его text
.
def dict_value(val: dict):
for key, item in val.items():
if type(item) == dict:
dict_value(item)
else:
print(item)
dict_value(data)
Это работает для приведенных выборочных данных. Однако это работает только в этом случае, потому что «текстовые» клавиши находятся на самом низком уровне в структуре. Если бы в словаре были какие-либо другие ключи, значения которых не были словарями, они также были бы напечатаны. Это также не дает указанного вывода. Тем не менее, это принятый ответ
Чтобы получить результат, как указано в исходном вопросе:
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.
Отвечает ли это на ваш вопрос? Найти все вхождения ключа во вложенных словарях и списках