2016-06-15 5 views
0

Я пытаюсь создать defaultdict в defaultdict на основе значения ключа. Мое мышление здесь может быть совершенно неправильным, но вот код для основного defaultdict;Вложенные defaultdict на основе ключа внутри словаря

def record(): 
    return { 
     'count': 0, 
     'key1': Counter(),  
    } 

1_record = defaultdict(record) 

Но что, если я хочу добавить ключ как defaultdict как это;

def record(): 
    return { 
     'count': 0, 
     'key1': Counter(), 
     'key2': { 
      'count': 0, 
      'nested_key1': Counter() 

    } 
} 

В приведенном выше примере, как я могу сделать 'key2' defaultdict? Возможно ли это, или я неправильно подхожу к проблеме?

+1

Не должно быть 'defaultdict (record)', без '()'? –

+0

yup, извините, отредактировал опечатка – user1165419

ответ

0

Вы, безусловно, можете иметь «рекурсивный» defaultdict:

>>> from collections import defaultdict 
>>> def record(): 
... return { 
...  'key': defaultdict(record) 
... } 
... 
>>> d = defaultdict(record) 
>>> 
>>> d['foo'] 
{'key': defaultdict(<function record at 0x10b396f50>, {})} 
>>> d['foo']['key']['bar'] 
{'key': defaultdict(<function record at 0x10b396f50>, {})} 
>>> d 
defaultdict(<function record at 0x10b396f50>, {'foo': {'key': defaultdict(<function record at 0x10b396f50>, {'bar': {'key': defaultdict(<function record at 0x10b396f50>, {})}})}}) 

Однако замена из названия клавиш на разных уровнях, вероятно, потребуется некоторые специальный корпус и сделает код немного более грязным. ..

+0

Привет, миллисон, не могли бы вы проверить мое редактирование? Я попробовал рекурсивный dict, но он дал мне ошибку, вы видите что-то не так в моем коде/подходе? – user1165419

+0

Ничего, подумал. Благодаря!! – user1165419

+0

Похоже, бит 'defaultdict' работает отлично ...' dict_record ['hello'] ['key2'] 'является' 'defaultdict (second_record)' 'so' dict_record ['hello'] ['key2 '] [' another_hello '] '- это возвращаемое значение из' second_record' ('dict'), и вы не можете добавить' 1' в 'dict'. – mgilson

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