Форум сайта python.su
Приветствую!
Есть словарь неограниченной вложенности. Например:
dd = { 'raz':{1:'1', 2:'2'}, 'test':{1:'20'}, 'dva':{ 1:'30', 'test':{1:'11'} } }
dd = { 'raz':{1:'1', 2:'2'}, 'dva':{ 1:'30' } }
def searchKey(key, dikt): slov = dikt for k in slov: if key == k: del slov[k] else: if len(slov[k]) != 0: # Проверяем, есть ли вложенность, если да, то: new_slov = slov[k] searchKey(key, new_slov) dikt = slov
Отредактировано Sterh (Май 15, 2020 21:33:27)
Офлайн
SterhТак ты удаляй его ещё до входа в словарь. Операция in есть.
Рекурсивно обойти и найти сам элемент - не проблема. Проблема удалить.
SterhДо входа в словарь применяешь in, по её результату применяешь del, потом заходишь в словарь рекурсивно. В нём уже всё будет удалено.
Если в рекурсии вкорячивать del, то получается, что изменяем итерируемый словарь.
SterhЗначит, должен перед del применить deepcopy и сохранить удаляемое поддерево в какое-то место, где будет адрес в исходном дереве и само удалённое поддерево. Для восстановления нужна будет тоже функция.
НО! Теперь самое главное! Мне нужна возможность “откатить” удаление. Т.е. вернуть удаленные элементы на прежнее место
Отредактировано py.user.next (Май 16, 2020 02:52:49)
Офлайн
Рекурсивно обойти и найти сам элемент - не проблема. Проблема удалить. Если в рекурсии вкорячивать del, то получается, что изменяем итерируемый словарь.Можно подойти к вопросу с другой стороны - проходя рекурсией, создавать новый словарь, в который копировать все пары ключ-значение, если это не test. Т.е. на самом деле вообще ничего не удалять.
Отредактировано Striver (Май 16, 2020 12:09:08)
Офлайн
StriverЭто можно сделать, просто скопировав словарь и применив к копии функцию простого удаления с рекурсивным обходом.
создавать новый словарь, в который копировать все пары ключ-значение, если это не test. Т.е. на самом деле вообще ничего не удалять.
Отредактировано py.user.next (Май 16, 2020 12:41:12)
Офлайн