Home > Enterprise >  Add values to unexisting keys in dictionary
Add values to unexisting keys in dictionary

Time:01-11

I have a directory with many pickled files, each containing a dictionary. The filename indicates the setting of the dictionary. E.g.: 20NewsGroup___10___Norm-False___Probs-True___euclidean.pickle.

I want to combine these different dicts all in one large dict. To do this, I have written the following code:

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

However, when I run this, I get a KeyError, as the key for splitted[0] does not yet exist. What is the best way to populate a dictionary similar to what I envision?

CodePudding user response:

you need to create in these fields

Example:

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

CodePudding user response:

You could use try-except blocks:

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

This code tries to access nested dictionary keys, if they don't exist, then the code will create them with an empty dictionary.

  • Related