Как создать вложенный словарь в цикле for (без использования defaultdict)?

мой ввод выглядит так:

test_file = [['ref1', 'test1', 2],
             ['ref2', 'test1', 3],
             ['ref3', 'test2', 4],
             ['ref1', 'test2', 4],
             ['ref2', 'test2', 1],
             ['ref1', 'test1', 4],
             ['ref1', 'test1', 5]]

И я пытаюсь получить вложенный словарь следующим образом:

desired_output = {'ref1':{'test1':[2,5,4]}, 
                  'ref1':{'test2':[4]}, 
                  'ref2':{'test1':[3]}, 
                  'ref2':{'test2':[1]}, 
                  'ref3':{'test2':[4]}}

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

AttributeError: объект collections.defaultdict не имеет атрибута «добавить»

Итак, я попробовал это:

for entry in test_file:
    nest1 = {}
    try:
        nest1[entry[1]].append(entry[2])
    except KeyError:
        nest1[entry[1]] = [entry[2]]
    try:
        mynestdict[entry[0]].append(nest1)
    except KeyError:
        mynestdict[entry[0]] = [nest1]

print(dict(mynestdict))

Но я получаю это:

{'ref1': [{'test1': [2]}, {'test2': [4]}, {'test1': [4]}, {'test1': [5]}], 
'ref2': [{'test1': [3]}, {'test2': [1]}], 
'ref3': [{'test2': [4]}]}

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

Покажите свой код с помощью defaultdict(), чтобы мы могли помочь вам исправить его.

Barmar 31.03.2023 19:11

желаемый результат недействителен, у вас не может быть дубликатов ключей ref1.

Barmar 31.03.2023 19:15

словарь ditto имеет дублирующую ключевую альтернативу, которая может быть '{"ref1":{"test1":[2,4,5],"test2":[4]},"ref2":{"test1":[3], "‌​test2":[1]},"ref3":{‌​"test2":[4]}}'

manoj 31.03.2023 19:31
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
3
67
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Поскольку вы создаете вложенные словари, вам нужны вложенные defaultdict().

result = defaultdict(lambda: defaultdict(list))

for key1, key2, value in test_file:
    result[key1][key2].append(value)

pprint(default_to_regular(result))
# Output:
{'ref1': {'test1': [2, 4, 5], 'test2': [4]},
 'ref2': {'test1': [3], 'test2': [1]},
 'ref3': {'test2': [4]}}

Получить default_to_regular() от Как преобразовать defaultdict of defaultdicts [of defaultdicts] в dict of dicts [of dicts]?

Ответ принят как подходящий

Я думаю, что результат, который вы ищете, это комбинация повторяющихся ключей:

{'ref1': {'test1': [2, 4, 5], 'test2': [4]}, 'ref2': {'test1': [3], 'test2': [1]}, 'ref3': {'test2': [4]}}

Для этого просто проверьте, существуют ли вложенные ключи, а если нет, то создайте их. Вы просили код, который не использует collections.defaultdict, и это не делает его слишком большим:

test_file = [['ref1', 'test1', 2],
             ['ref2', 'test1', 3],
             ['ref3', 'test2', 4],
             ['ref1', 'test2', 4],
             ['ref2', 'test2', 1],
             ['ref1', 'test1', 4],
             ['ref1', 'test1', 5]]

d = {}
for el in test_file:
    if el[0] not in d:
        d[el[0]] = {}
    if el[1] not in d[el[0]]:
        d[el[0]][el[1]] = []

    d[el[0]][el[1]].append(el[2])

print(d)
test_file = [['ref1', 'test1', 2],
             ['ref2', 'test1', 3],
             ['ref3', 'test2', 4],
             ['ref1', 'test2', 4],
             ['ref2', 'test2', 1],
             ['ref1', 'test1', 4],
             ['ref1', 'test1', 5]]


df = pd.DataFrame(test_file)


df.groupby([0, 1])[2].apply(np.array).unstack().agg(lambda x: x.dropna().to_dict(), axis=1).to_json()


'{"ref1":{"test1":[2,4,5],"test2":[4]},"ref2":{"test1":[3],"test2":[1]},"ref3":{"test2":[4]}}'

Другие вопросы по теме