Добавить значения к несуществующим ключам в словаре

У меня есть каталог со многими маринованными файлами, каждый из которых содержит словарь. Имя файла указывает на настройку словаря. Например: 20NewsGroup___10___Norm-False___Probs-True___euclidean.pickle.

Я хочу объединить эти разные словари в один большой словарь. Для этого я написал следующий код:

PATH = '<SOME PATH>'
all_dicts = os.listdir(PATH)

one_dict = dict()

for i, filename in enumerate(all_dicts):
    infile = open(PATH+filename, 'rb')
    new_dict = pickle.load(infile)
    infile.close()
    splitted = filename.split('___')
    splitted[4] = splitted[4].split('.')[0]
    one_dict[splitted[0]][splitted[1]][splitted[2]][splitted[3]][splitted[4]] = new_dict

Однако, когда я запускаю это, я получаю KeyError, так как ключ для splitted[0] еще не существует. Каков наилучший способ заполнить словарь, подобный тому, что я себе представляю?

Вы проверили это? stackoverflow.com/questions/30864702/… вы можете перебирать файлы каталогов и комбинировать

Siva Shanmugam 10.01.2023 11:17

Спасибо, Шива, с ответом в этом посте информация о настройках теряется.

Emil 10.01.2023 11:21
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Отказ от ответственности: Эта статья предназначена только для демонстрации и не должна использоваться в качестве инвестиционного совета.
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
Потяните за рычаг выброса энергососущих проектов
Потяните за рычаг выброса энергососущих проектов
На этой неделе моя команда отменила проект, над которым я работал. Неделя усилий пошла насмарку.
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Привет, люди RPA, это снова я и я несу подарки! В очередном моем приключении о том, как создавать ботов для облегчения рутины. Вот, думаю, стоит...
1
2
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Вам нужно создать в этих полях

Пример:

from typing import List

PATH = '<SOME PATH>'
all_dicts = os.listdir(PATH)

def check_exist_path(target_dict, paths: List[str]):
     for key in paths:
          if key not in target_dict:
               target_dict[key] = {}

          target_dict = target_dict[key]

one_dict = dict()

for i, filename in enumerate(all_dicts):
    infile = open(PATH+filename, 'rb')
    new_dict = pickle.load(infile)
    infile.close()
    splitted = filename.split('___')
    splitted[4] = splitted[4].split('.')[0]

    for i in range(5):
        check_exist_path(one_dict, [splitted[j] for j in range(i)])

    one_dict[splitted[0]][splitted[1]][splitted[2]][splitted[3]][splitted[4]] = new_dict

Вы можете использовать блоки try-except:

for i, filename in enumerate(all_dicts):
    infile = open(PATH+filename, 'rb')
    new_dict = pickle.load(infile)
    infile.close()
    splitted = filename.split('___')
    splitted[4] = splitted[4].split('.')[0]
    try:
        one_dict[splitted[0]][splitted[1]][splitted[2]][splitted[3]][splitted[4]] = new_dict
    except KeyError:
        one_dict[splitted[0]] = {}
        one_dict[splitted[0]][splitted[1]] = {}
        one_dict[splitted[0]][splitted[1]][splitted[2]] = {}
        one_dict[splitted[0]][splitted[1]][splitted[2]][splitted[3]] = {}
        one_dict[splitted[0]][splitted[1]][splitted[2]][splitted[3]][splitted[4]] = new_dict

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

Пожалуйста, проверьте свое решение для all_dicts = {"20NewsGroup___10___Norm-False___Probs-True___euclidean.pic‌​kle", "20NewsGroup___20___Norm-False___Probs-True___euclidean.pick‌​le"}

Denis Artyushin 10.01.2023 13:09

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