2014-01-27 2 views
2

У меня есть код, который использует класс NestedDict здесь: How can I access a deeply nested dictionary using tuples?. «У меня есть полностью рабочий пример, основанный на ответе @ JCash:«Как удалить из артерального глубоко вложенного словаря

Есть две вещи, которые я хотел бы сделать с этим, что вызывает у меня проблемы. Во-первых, я хотел бы удалить один из его элементов, если значение этого элемента равно нулю. во-вторых, если элемент является пустым словарем, потому что все записи этого словаря были удалены, я хотел бы удалить пустой словарь.

Использование класса расположены выше, примером может служить следующее:

my_tuple = (0, 1, 0, 0, 0, 1, 0, 0) 
d = NestedDict() 
print d 
d[my_tuple] = 4 
print d 

#del d[my_tuple] 

del d[0][1][0][0][0][1][0][0] 
del d[0][1][0][0][0][1][0] 
del d[0][1][0][0][0][1] 
del d[0][1][0][0][0] 
del d[0][1][0][0] 
del d[0][1][0] 
del d[0][1] 
del d[0] 

print d 

Длинный список дель является необходимым для того, чтобы избавиться от нескольких уровней вложенности. закомментированный оператор del (который дает ошибку ключа) - это то, что я хотел бы реализовать, с кортежем произвольной длины.

Удаление промежуточных уровней не должно быть затруднено, как только я выясню, как удалить первый. Я уже знаю, что хочу удалить, и я могу проверить пустые словари с помощью: if (словарная запись) == {})

Любые идеи?

Edit: Выход:

{} 
{0: {1: {0: {0: {0: {1: {0: {0: 4}}}}}}}} 
{} 
+1

Пожалуйста размещаете выход 'печати d' – inspectorG4dget

+0

Я думаю, что это должно быть, просто не конечно, как, в этом случае. – juggler

+0

, если вы просто 'del d [0]', он удалит все вложенное в 'd [0]' ... – roippi

ответ

2

Сделана функция deepdelete которая принимает список ключей и рекурсивно удаляет лист, а затем с помощью любых отраслевых словарей, которые теперь пусты:

def deepdelete(branch, keys): 
    if len(keys) > 1:         # not at the leaf 
     empty = deepdelete(branch[keys[0]], keys[1:]) # recursion 
     if empty:          
      del branch[keys[0]]      # delete branch 
    else:            # at the leaf 
     del branch[keys[0]]       # delete the leaf 
    return len(branch) == 0       # could return len 

deepdelete(d, delkeys) 

Passing в словаре, которое вы указали в качестве примера:

d = {0: {1: {0: {0: {0: {1: {0: {0: 4}}}}}}}} 
deepdelete(d, (0, 1, 0, 0, 0, 1, 0, 0)) 

Выходы:

{} 

Переходя в более интересном словаре с другими отраслями:

d = {0: {1: {0: {0: {0: {1: {0: {0: 4}}, 'no_delete': 2}, 'other_data': 3}, 'keep_me': 4}, 'special': 4}, 'preserve': 1}, 'important': 50} 
deepdelete(d, (0, 1, 0, 0, 0, 1, 0, 0)) 

Выходы:

{0: {'preserve': 1, 1: {0: {0: {0: {'no_delete': 2}, 'other_data': 3}, 'keep_me': 4}, 'special': 4}}, 'important': 50} 
+0

ОК, это может быть блестяще, но у меня есть проблема. Я включил ваш код в новый файл, а затем положил в свой первый пример два строки и попытался запустить его. он дает мне «IndentationError: неожиданный unindent ' для строки: 'd = {0: {1: {0: {0: {0: {1: {0: {0: 4}}}}}}}} '. Я даже поставил def внутри класса, такую ​​же проблему. Я бы поставил свой точный код, но он не подходит в комментарии. можете ли вы включить простейший код, который позволит мне проверить этот ответ? Я уверен, что могу поместить ваш def в другой файл и импортировать его, но я хотел бы узнать простейший способ сделать это. благодаря. – juggler

+0

Я был ленив .. некоторые ответы здесь? [link] (http://stackoverflow.com/questions/10239668/indentationerror-unexpected-unindent-why) – juggler

+0

@juggler, Ха, да, я добавил попытку временно, но затем не полностью удалил ее перед отправкой ответа. Хороший улов; попробуй. – mhlester

Смежные вопросы