Есть словарь неограниченной вложенности. Например:
dd = { 'raz':{1:'1', 2:'2'}, 'test':{1:'20'}, 'dva':{ 1:'30', 'test':{1:'11'} } }
Мне нужно найти все test и удалить их из словаря. При этом, если test является ключом, то удаляем все, что ниже по вложенности. Если конечным элементом, то удаляем конечный элемент.
Т.е., после удаления должно получится так:
dd = { 'raz':{1:'1', 2:'2'}, 'dva':{ 1:'30' } }
Рекурсивно обойти и найти сам элемент - не проблема. Проблема удалить. Если в рекурсии вкорячивать del, то получается, что изменяем итерируемый словарь.
Можно сделать копию словаря и удалять в ней, потом перевернуть.
Например:
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
НО! Теперь самое главное! Мне нужна возможность “откатить” удаление. Т.е. вернуть удаленные элементы на прежнее место, через update к примеру. Для этого нужно как то сохранить пути, где эти элементы стояли в исходном словаре. Как это сделать?
Или просто - найти элемент и сохранить в переменную к нему путь?