2016-05-02 3 views
0

Я пытаюсь написать код, который включает в себя создание словаря по умолчанию для словарей. Однако я понятия не имею, как инициализировать/создать такую ​​вещь. Моя текущая попытка выглядит примерно так:Как создать словарь по умолчанию для словарей

from collections import defaultdict 
inner_dict = {} 
dict_of_dicts = defaultdict(inner_dict(int)) 

Использование этого по умолчанию Словаря словарей должны для каждой пары слов, которые я произвожу из файла я открываю (например, [[ «M UH M», «м oo m ']]), чтобы каждый отрезок первого слова, ограниченный пустым пространством, был ключ во внешнем словаре, а затем для каждого сегмента во втором слове, ограниченном пустым пространством, подсчитывали частоту этого сегмента.

Например

[['M UH M', 'm oo m']] 
(<class 'dict'>, {'M': {'m': 2}, 'UH': {'oo': 1}}) 

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

Извините, если это дубликат, однако предыдущие ответы на эти вопросы были путаными и в другом контексте.

+0

Ну, ваш текущий код как вставленный недействителен ... 'inner_dict' определяется как словарь, а затем вы пытаетесь называть его' inner_dict (int) '... – donkopotamus

ответ

0

Чтобы инициализировать defaultdict, который создает словари в качестве значения по умолчанию вы будете использовать:

d = defaultdict(dict) 

Для этой конкретной проблемы, collections.Counter был бы более подходящим

>>> from collections import defaultdict, Counter 
>>> d = defaultdict(Counter) 
>>> for a, b in zip(*[x.split() for x in ['M UH M', 'm oo m']]): 
... d[a][b] += 1 
>>> print(d) 
defaultdict(collections.Counter, 
      {'M': Counter({'m': 2}), 'UH': Counter({'oo': 1})}) 

Редактировать

Вы выразили заинтересованность в комментарии об эквиваленте без Counter. Вот эквивалент с помощью простого dict

>>> from collections import defaultdict 
>>> d = defaultdict(dict) 
>>> for a, b in zip(*[x.split() for x in ['M UH M', 'm oo m']]): 
... d[a][b] = d[a].get(b, 0) + 1 
>>> print(d) 
defaultdict(dict, {'M': {'m': 2}, 'UH': {'oo': 1}}) 
+0

Это изящный способ! Есть ли способ сделать это без Counter, но вместо этого просто словари и словари по умолчанию? –

+0

@IndifferentPotato Я добавил эквивалент, используя 'defaultdict (dict)' – donkopotamus

+0

. Эквивалент с простым ** dict ** выводит объект AttributeError: 'list' не имеет атрибута 'split' '. :/ –

0

Вы также мог использовать обычный словарь и метод его setdefault.

my_dict.setdefault(key, default) будет искать my_dict[key] и ...

  • ... если ключ уже существует, то вернуть его текущее значение, не изменяя его, или ...
  • ... присвоить значение по умолчанию (my_dict[key] = default), а затем верните это.

Таким образом, вы можете позвонить my_dict.setdefault(key, {}) всегда, когда вы хотите получить значение из вашего внешнего словаря вместо нормального my_dict[key] получить либо реальное значение, присвоенное этим ключом, если # S присутствует, или получить новый пустой словарь как значение по умолчанию, которое автоматически сохраняется в вашем внешнем словаре.

Пример:

outer_dict = {"M": {"m": 2}} 

inner_dict = d.setdefault("UH", {}) 
# outer_dict = {"M": {"m": 2}, "UH": {}} 
# inner_dict = {} 
inner_dict["oo"] = 1 
# outer_dict = {"M": {"m": 2}, "UH": {"oo": 1}} 
# inner_dict = {"oo": 1} 

inner_dict = d.setdefault("UH", {}) 
# outer_dict = {"M": {"m": 2}, "UH": {"oo": 1}} 
# inner_dict = {"oo": 1} 
inner_dict["xy"] = 3 
# outer_dict = {"M": {"m": 2}, "UH": {"oo": 1, "xy": 3}} 
# inner_dict = {"oo": 1, "xy": 3} 

Таким образом, вы всегда получите правильный inner_dict, либо пустое по умолчанию один или тот, который уже присутствует для данного ключа. Поскольку словари являются изменяемыми типами данных, изменение возвращаемого inner_dict также изменяет словарь внутри outer_dict.

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

  • Нет связанных вопросов^_^