@rsytrade

Как обойти словарь в Python?

Есть многоуровневый словарь, из которого нужно забрать определенные значения (если есть). Как можно укоротить такую конструкцию?
for doc in article['key_1']['key_2']:
            if doc.get('attachment'):
                if doc['attachment'].get('file'):
                    if doc['attachment']['file'] == 'val_1':
                        name = doc['attachment']['key_4']

P.S. вариант рабочий, но думаю должно быть более элегантное решение...
  • Вопрос задан
  • 153 просмотра
Решения вопроса 1
iggor-markin
@iggor-markin
Python Developer
Вариант
article = article.get('key_1', {}).get('key_2')
if article:           
    for doc in article:
        attachment = doc.get('attachment', {})
        if attachment.get('file') == 'val_1':
            name = attachment.get('key_4')
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@twistfire92
Python backend developer
Можно для таких случаев написать рекурсивную функцию, которая будет принимать на вход основной словарь и путь до нужного ключа.
На коленке написал вот такой пример:
def get_value_from_dict(dct, path):
    if not path:
        return
    
    key = path[0]
    new_path = path[1:]
    if curr_value := dct.get(key, None):
        if new_path:
            if type(curr_value) == dict:
                if new_path:
                    return get_value_from_dict(curr_value, new_path)
            else:
                return
        else:
            return curr_value

   

d={
    "lvl1_1": {
        "lvl2_1": {
            "lvl3_1": "value",
            "lvl3_2": {
                "lvl4_1": "value"
            },
        "lvl2_2": "value"
        }
    }
} 

print(get_value_from_dict(d, ["lvl1_1", "lvl2_1", "lvl3_2", "lvl4_1"]))

Возможно там есть некоторые ошибки, наверняка можно было более красиво написать, но поиграйтесь с этим кодом.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы