возврат вложенного словаря из функции
Возможно ли вернуть написать функцию, которая будет возвращать вложенный словарь исходя из аргументов?
Например:
def foo(key):
d = {'a': 1, 'b': 2, 'c': {'d': 3, 'e': 4}, }
return d[key]
foo(['c']['d'])
Я ожидаю получить:
3
Я получаю:
TypeError: list indices must be integers or slices, not str
Я понимаю, что можно возвращать весь словарь, или захардкодить возврать конкретной части словаря, но это все крайне не гибко
Ответы (2 шт):
само ['c']['d'] синтаксическая ошибка. поэтому придётся передавать список ['c','d'] и в цикле или рекурсивно решать задачу. Например так:
def foo(key,d):
while len(key):
d = d[key[0]]
key = key[1:]
return d
d = {'a': 1, 'b': 2, 'c': {'d': 3, 'e': 4}, }
print(foo(['c','d'],d))
В данном случае проще возвращать весь словарь, и к возвращенному значению уже обращаться по индексам: foo()['c']['d'] - это очень даже гибко.
Другой вариант - передавать в функцию другую функцию, которая будет брать нужное значение (или вообще выполнять какие-то произвольные вычисления от исходной структуры данных):
def foo(key):
d = {'a': 1, 'b': 2, 'c': {'d': 3, 'e': 4}, }
return key(d)
print(foo(lambda x: x['c']['d']))
Так например работают функции сортировки по произвольному ключу:
d = [dict(a=5), dict(a=3), dict(a=10)]
d.sort(key=lambda x: x['a'])
print(d) # [{'a': 3}, {'a': 5}, {'a': 10}]