Извлечение значения из вложенного словаря или списка по точечному пути

Проходите компоненты пути: в dict ищите строковый ключ, в list — неотрицательный числовой индекс. Любая недоступная ступень возвращает None.

Короткий ответ

Что ответить на собеседовании

Проходите компоненты пути: в dict ищите строковый ключ, в list — неотрицательный числовой индекс. Любая недоступная ступень возвращает None.

Подробный разбор

Ответ с пояснениями

Условие

Реализуйте функцию get_by_path(obj: dict | list, path: str) -> Any, которая принимает:

  • obj – произвольный вложенный словарь или список;
  • path – строку, описывающую последовательность ключей/индексов, разделённых точкой.

Функция должна пройти по указанному пути и вернуть найденное значение. Если в любой момент путь оказывается недоступным (отсутствующий ключ, неверный тип данных, выход за границы списка и т.п.), следует вернуть None.

Пример использования:

obj = {
    'a': {
        'b': {
            'c': 1
        }
    }
}

get_by_path(obj, 'a.b.c')  # вернёт 1
get_by_path(obj, 'a.d.e')  # вернёт None

Код функции-стартера:

from typing import Any

def get_by_path(obj: dict | list, path: str) -> Any:
    ...

Ответ

Проходите компоненты пути: в dict ищите строковый ключ, в list — неотрицательный числовой индекс. Любая недоступная ступень возвращает None.

def get_by_path(obj, path):
    if not path:
        return obj
    current = obj
    for part in path.split('.'):
        if isinstance(current, dict):
            if part not in current:
                return None
            current = current[part]
        elif isinstance(current, list):
            if not part.isascii() or not part.isdecimal():
                return None
            try:
                index = int(part)
            except ValueError:
                return None
            if index >= len(current):
                return None
            current = current[index]
        else:
            return None
    return current

Здесь пустой путь означает сам объект, отрицательные индексы запрещены. Ключи с точкой требуют отдельного escaping-контракта. Настоящее значение None неотличимо от отсутствующего пути — это соответствует выбранному условию.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее