смешивание defaultdict (dict и int) - PullRequest
       26

смешивание defaultdict (dict и int)

0 голосов
/ 22 декабря 2018

У меня есть 2 списка примеров, и я хочу получить вложенный словарь по умолчанию с суммой значений.

Следующий код работает хорошо:

from collections import defaultdict

l1 = [1,2,3,4]
l2 = [5,6,7,8]
dd = defaultdict(int)

for i in l1:
    for ii in l2:
        dd[i] += ii

но я пытаюсь создать ключ по умолчанию в словаре d:

from collections import defaultdict

l1 = [1,2,3,4]
l2 = [5,6,7,8]
dd = defaultdict(int)

for i in l1:
    for ii in l2:
        dd[i]['mykey'] += ii

, и это приводит к ошибке:

Traceback (most recent call last):
  File "/usr/lib/python3.6/code.py", line 91, in runcode
    exec(code, self.locals)
  File "<input>", line 1, in <module>
  File "<string>", line 12, in <module>
TypeError: 'int' object is not subscriptable

По сути, я не могу понять, есть ли шанс смешать defaultdict(dict) и defaultdict(int).

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

Структура данных defaultdict получает функцию, которая будет предоставлять значение по умолчанию, поэтому, если вы хотите создать defautdict(int) в качестве значения по умолчанию, предоставьте функцию, которая делает это, например, lambda : defaultdict(int):

from collections import defaultdict
from pprint import pprint

l1 = [1, 2, 3, 4]

l2 = [5, 6, 7, 8]

dd = defaultdict(lambda : defaultdict(int))

for i in l1:

    for ii in l2:
        dd[i]['mykey'] += ii


pprint(dd)

Выход

defaultdict(<function <lambda> at 0x7efc74d78f28>,
            {1: defaultdict(<class 'int'>, {'mykey': 26}),
             2: defaultdict(<class 'int'>, {'mykey': 26}),
             3: defaultdict(<class 'int'>, {'mykey': 26}),
             4: defaultdict(<class 'int'>, {'mykey': 26})})
0 голосов
/ 22 декабря 2018

Вы хотите, чтобы значение по умолчанию для значения по умолчанию для целочисленного значения:

dd = defaultdict(lambda: defaultdict(int))

после выполнения кода:

>>> dd
{1: defaultdict(<class 'int'>, {'mykey': 26}),
 2: defaultdict(<class 'int'>, {'mykey': 26}),
 3: defaultdict(<class 'int'>, {'mykey': 26}),
 4: defaultdict(<class 'int'>, {'mykey': 26})}
...