Home > Net >  I have a dictionary that isn't behaving as I expect, what's wrong with it?
I have a dictionary that isn't behaving as I expect, what's wrong with it?

Time:06-24

Example dictionary

{
"01_timelines": {
    "00_data-managment": {},
    "01_rush-and-spot": {}
},
"02_source": {
    "00_from_external": {
        "01_fonts": {},
        "02_logos": {},
        "03_graphics": {},
        "04_video": {},
        "05_3d": {}
    },
    "01_imported_projects": {}

}

I've looked at: How to completely traverse a complex dictionary of unknown depth?

and some others but If I run the function on my dictionary it will return empty?? I don't know why.

I'm trying to create a custom function:

def print_dict(myfolders,depth,breadcrumb,olddepth):
    
depth  = 1
for key,value in myfolders.items():
          
    if isinstance(value, dict):
        if depth == 0:
            olddepth = depth
            breadcrumb = []
            # print(key)
            breadcrumb.append(key)
        elif depth != olddepth:
            olddepth = depth
            # tmp = breadcrumb
            # tmp.pop()
            # tmp.append(key)
            breadcrumb.append(key)
            print(breadcrumb,key)
        else:
            print(breadcrumb,key)
        
    print_dict(value,depth,breadcrumb,olddepth)

But it's not completely working: Output needs to be a list:

['01_timelines', '00_data-managment']
['01_timelines', '01_rush-and-spot']
['02_source', '00_from_external']
['02_source', '00_from_external','01_fonts']
['02_source', '00_from_external','02_logos']

enz

CodePudding user response:

You can replace print_dict function with the following one and reduce passing arguments

myfolders = {
    "01_timelines": {
        "00_data-managment": {},
        "01_rush-and-spot": {}
    },
    "02_source": {
        "00_from_external": {
            "01_fonts": {},
            "02_logos": {},
            "03_graphics": {},
            "04_video": {},
            "05_3d": {}
        },
        "01_imported_projects": {}
    }
}

def print_dict(myfolders, breadcrumb=[]):
    for key, value in myfolders.items():
        breadcrumb_now = breadcrumb   [key]
        print(breadcrumb_now)

        if isinstance(value, dict):
            if value: # if value dictionary is not empty then go deep
                print_dict(myfolders[key], breadcrumb_now)
print_dict(myfolders)

This will result in following output

['01_timelines']
['01_timelines', '00_data-managment']
['01_timelines', '01_rush-and-spot']
['02_source']
['02_source', '00_from_external']
['02_source', '00_from_external', '01_fonts']
['02_source', '00_from_external', '02_logos']
['02_source', '00_from_external', '03_graphics']
['02_source', '00_from_external', '04_video']
['02_source', '00_from_external', '05_3d']
['02_source', '01_imported_projects']

CodePudding user response:

Try:

dct = {
    "01_timelines": {"00_data-managment": {}, "01_rush-and-spot": {}},
    "02_source": {
        "00_from_external": {
            "01_fonts": {},
            "02_logos": {},
            "03_graphics": {},
            "04_vid1eo": {},
            "05_3d": {},
        },
        "01_imported_projects": {},
    },
}


def get_lists(d, breadcrumb=None):
    if breadcrumb is None:
        breadcrumb = []

    if isinstance(d, dict):
        for k in d:
            new_breadcrumb = [*breadcrumb, k]
            yield new_breadcrumb
            yield from get_lists(d[k], new_breadcrumb)


print(list(get_lists(dct)))

Prints:

[
    ["01_timelines"],
    ["01_timelines", "00_data-managment"],
    ["01_timelines", "01_rush-and-spot"],
    ["02_source"],
    ["02_source", "00_from_external"],
    ["02_source", "00_from_external", "01_fonts"],
    ["02_source", "00_from_external", "02_logos"],
    ["02_source", "00_from_external", "03_graphics"],
    ["02_source", "00_from_external", "04_vid1eo"],
    ["02_source", "00_from_external", "05_3d"],
    ["02_source", "01_imported_projects"],
]
  • Related