Этот вопрос закрыт для ответов, так как повторяет вопрос Как передать ключ "сложного" словаря в качестве аргумента функции?

Как поменять значение во вложенном словаре по списку ключей?

Получаю строку вида 'first_sec_x' членов, разделенных нижним подчеркиванием, может быть от одного до миллиона(условно) . Мне нужно каким-то образом записать в список по этому адрессу значение ,т.е.
somedict['first']['sec']['x'] , хочу написать для этого отдельную функцию, но кол-во таких членов очень разнится и я не знаю как реализовать это без кучи if-else. Подскажите, как такое сделать.
p.s. мне нужно именно записать по этому адресу значение, так что просто в цикле продвигаться по уровням словаря не выйдет.
  • Вопрос задан
  • 68 просмотров
Решения вопроса 1
Fockker
@Fockker
Потомок старинного рода Ипатьевых-Колотитьевых
просто в цикле продвигаться по уровням словаря не выйдет!

На самом деле выйдет, поскольку в Питоне новая переменная является ссылкой на старую.
Перебираем все ключи кроме последнего и потом присваиваем ему новое значение
def changeDictValueByPath(my_dict, path, value):
    tmp_dict = my_dict
    for k in path[:-1]:
        tmp_dict = tmp_dict[k]
    tmp_dict[path[-1]] = value

indices = "first_sec_x"
source = {"first": {"sec": {"x": 1}}}
changeDictValueByPath(source, indices.split("_"), 2)
print(source);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@PavelMos
Ламерское решение, но должно работать. Есть функции exal и exec, они выполняют строку как строку кода.
тогда
1. сначала разбить first_.... через split в ['first', 'sec', 'x']
2. создать словарь somedict={}
3. задать значение например value=999
4. создать и выполнить выражение
exec ( "somedict = {'"+"':{'".join(x)+"'"+':'+str(value)+'}'*(len(x)) )

после этого выполнится somedict={'first':{'sec':{'x':999}}}

Но если хочется найти нормальное решение, рекомендую на инглише поискать, возможно что-то есть через рекурсию или какие-то модули
апдейт:
def mylist(L):
    if not L:
        return (999)
    else:
        return {L[0]: mylist(L[1:])}
    
mylist(x)
Out[120]: {'first': {'sec': {'x': {'y': {'z': 999}}}}}
Ответ написан
Ваш ответ на вопрос

Вопрос закрыт для ответов и комментариев

Потому что уже есть похожий вопрос.
Похожие вопросы