Вот простой пример того, чего, я думаю, вы пытаетесь достичь:
>>> rows = [[1,2,3], [1,2,4], [1,3,3], [1,3,5], [2,3,9], [2,3,5]]
>>> ret = {}
>>> for row in rows:
... ret.setdefault(row[0], {}).setdefault(row[1], []).append(row[2])
...
>>> ret
{1: {2: [3, 4], 3: [3, 5]}, 2: {3: [9, 5]}}
Как это работает?Для каждого row
:
- Мы ищем
row[0]
в ret
ключах.Если его нет, мы добавляем пару (row[0], {})
к dict, {}
- вложенный dict.Если оно присутствует, мы продолжаем. - Значение
row[1]
является ключом вложенного dict.Мы ищем его в ret[row[0]]
(первое setdefault
возвращение): если его нет, мы добавляем пустой список. - Добавляем значение
row[2]
в список ret[row[0]][row[1]]
Помните, что:
ret.setdefault(row[0], value_if_absent).func()
Означает:
if row[0] not in ret:
ret[row[0]] = value_if_absent
ret[row[0]].func()
Обычно value_if_absent
является контейнером, а func
является одним из append
, extend
, update
, ... методы.Но func
также может быть setdefault
для создания нового контейнера при необходимости.