Проходите компоненты пути: в 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 неотличимо от отсутствующего пути — это соответствует выбранному условию.