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

Он также подвержен проблемам, связанным с «выстрелом себе в ногу», потому что очень легко забыть, что у вас есть defaultdict, сделать что-то вроде a['hello'] и забыть, что это автоматически создаст там ценность.

Я не использовал defaultdict годами. Вместо этого я использую dict.setdefault, который дает любому словарю такую ​​же функциональность и имеет дополнительное преимущество, заключающееся в том, что часть создания или доступа видна, когда это происходит, а не где-либо еще при создании коллекции.

Обратите внимание, что это не сработает, если создание элемента по умолчанию стоит дорого, но 9 раз из 10 я пишу d.getdefault(key, {}), так что это не проблема.