вложенный defaultdict на основе ключа внутри словаря

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

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

1_record = defaultdict(record)

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

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

    }
}

В приведенном выше, как я могу сделать «key2» по умолчанию? Это вообще возможно или я неправильно подхожу к проблеме?


person user1165419    schedule 15.06.2016    source источник
comment
Разве это не должно быть defaultdict(record) без ()?   -  person tobias_k    schedule 15.06.2016
comment
да, извините, отредактированная опечатка   -  person user1165419    schedule 15.06.2016


Ответы (1)


У вас определенно может быть «рекурсивный» 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>, {})}})}})

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

person mgilson    schedule 15.06.2016
comment
Эй, мгилсон, не мог бы ты проверить мою правку? Я попробовал рекурсивный дикт, но это дало мне ошибку, вы видите что-то не так в моем коде/подходе? - person user1165419; 15.06.2016
comment
Похоже, бит defaultdict работает нормально... dict_record['hello']['key2'] — это defaultdict(second_record), поэтому dict_record['hello']['key2']['another_hello'] — это возвращаемое значение из second_record (dict), и вы не можете добавить 1 к dict. - person mgilson; 15.06.2016