Можно ли использовать вложенный словарь с помощью setdefault, добавляя в список? - PullRequest
0 голосов
/ 17 апреля 2019

Я хотел бы иметь вложенный словарь со списком значений, которые прикреплены к подразделу.Не удается распознать подраздел.

month = {}
    for row in date:
        month.setdefault(row[1],{row[0]: []})
        month[row[0]].append(row[4])

print(month[main_key][sub_key])

Я ожидаю, что список значений будет заполнен с помощью добавляющего метода.Тем не менее, я продолжаю получать keyError.

Желаемый вывод:

{'row[1]': {'row[0]' :[row[4], row[4], row[4]],
            'row[0]' :[row[4], row[4], row[4]]}}

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

Вот простой пример того, чего, я думаю, вы пытаетесь достичь:

>>> 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:

  1. Мы ищем row[0] в ret ключах.Если его нет, мы добавляем пару (row[0], {}) к dict, {} - вложенный dict.Если оно присутствует, мы продолжаем.
  2. Значение row[1] является ключом вложенного dict.Мы ищем его в ret[row[0]] (первое setdefault возвращение): если его нет, мы добавляем пустой список.
  3. Добавляем значение 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 для создания нового контейнера при необходимости.

0 голосов
/ 17 апреля 2019

Давайте следовать инструкциям в блоке цикла for.

Первое:

month.setdefault(row[1], {row[0]: []})

Это установит значение {row[0]: []} ( словарь ) для ключа row[1], где ключ не был вставлен в month.

Следующее утверждение:

month[row[0]].append(row[4])

Добавляет row[4] к списку, полученному из month с ключом row[0]. Эта строка должна содержать ошибку, учитывая, что даже если ключ существует в month, значение, с которым он связан, представляет собой словарь , а не список.

Эта строка должна быть записана как:

month[row[1]][row[0]].append(row[4])

month[row[1]] извлекает словарь в паре с ключом row[1], который затем индексируется для доступа к списку в паре с row[0].

...