Python defaultdict лямбда

Я пытаюсь использовать defaultdict в python. код выглядит следующим образом:

dd = defaultdict(lambda :[0,0])
dd[5][4] = 2
print(dd)

Но выдает IndexError

IndexError: list assignment index out of range

и как только я изменю код на

dd[2][1] = 2

результат:

defaultdict(<function <lambda> at 0x000001F9F10EE730>, {2: [0, 2]})

Я не знаю, почему индекс выходит за пределы диапазона и как появляется диапазон.

Спасибо!


person Alex    schedule 01.01.2017    source источник


Ответы (1)


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

Когда вы делаете dd[5][4] = 2, поскольку ключ 5 не существует, defaultdict генерирует значение [0,0], как и ожидалось.

Затем вы получаете доступ к 5-му индексу, который находится вне допустимого диапазона (как вы бы сделали [0,0][4] = 2)

(конечно, это работает с dd[2][1] = 2, потому что 1 находится в диапазоне списка по умолчанию)

Если вы не знаете размер своих списков и не хотите знать, я предлагаю использовать словарь по умолчанию в словаре целых чисел по умолчанию, например:

dd = defaultdict(lambda : defaultdict(int))

(конечно, это не генерирует массив, а диктовку диктов, но конструкция dd[5][4] работает сразу)

person Jean-François Fabre    schedule 01.01.2017