Больше вложенных Python вложенных словарей - PullRequest
3 голосов
/ 24 марта 2010

После прочтения Каков наилучший способ реализации вложенных словарей? почему неправильно делать:

c = collections.defaultdict(collections.defaultdict(int))

в питоне? Я думаю, что это будет работать, чтобы произвести

{key:{key:1}}

или я ошибаюсь?

Ответы [ 2 ]

14 голосов
/ 24 марта 2010

Конструктор defaultdict ожидает вызова. defaultdict(int) является объектом словаря по умолчанию, а не вызываемым. Использование lambda может работать, однако:

c = collections.defaultdict(lambda: collections.defaultdict(int))

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

Вот пример:

>>> import collections
>>> c = collections.defaultdict(lambda: collections.defaultdict(int))
>>> c[5][6] += 1
>>> c[5][6]
1
>>> c[0][0]
0
>>> 
5 голосов
/ 24 марта 2010

Эли Бендерский дает отличный прямой ответ на этот вопрос. Также может быть лучше реструктурировать ваши данные до

>>> import collections
>>> c = collections.defaultdict(int)
>>> c[1, 2] = 'foo'
>>> c[5, 6] = 'bar'
>>> c
defaultdict(<type 'int'>, {(1, 2): 'foo', (5, 6): 'bar'})

в зависимости от того, что вам действительно нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...