How to group similar items into a python list of dictionaries for HTML ul list

Question:

I am trying to create an HTML selected menu. I have the following python data structure:

categories = [
        ['Sports & Outdoors', 'Outdoor Recreation', 'Skates, Skateboards & Scooters']
        ['Toys & Games', 'Learning & Education', 'Science Kits & Toys']
        ['Toys & Games', 'Arts & Crafts', 'Craft Kits']
        ['Toys & Games', 'Arts & Crafts', 'Drawing & Painting Supplies', 'Crayons']
        ['Home & Kitchen', 'Home Décor', 'Window Treatments', 'Window Stickers & Films']
    ]

However to get this to work with the HTML/JQuery menu, I need to change the above data structure to this:

categories = [
            {
                "name": 'Sports & Outdoors',
                "subcategory": [
                    {
                        "name": 'Outdoor Recreation',
                        "subcategory": [
                            {
                                "name": 'Skates, Skateboards & Scooters',
                                "last": True
                            }
                        ]
                    }
                ]
            },
            {
            "name": 'Toys & Games',
            "subcategory": [
                {
                    "name": 'Learning & Education',
                    "subcategory": [
                        {
                        "name": 'Science Kits & Toys',
                        "last": True
                        }
                    ]
                },
                {
                    "name": 'Arts & Crafts',
                    "subcategory": [
                        {
                            "name": 'Craft Kits',
                            "last": True
                        },
                        {
                            "name": 'Drawing & Painting Supplies',
                            "subcategory": [
                                {
                                    "name": 'Crayons',
                                    "last": True
                                }
                            ]
                        }
                    ]
                },
                
            ]
                
            },
            {
                "name": 'Home & Kitchen',
                "subcategory": [
                    {
                    "name": 'Home Décor',
                        "subcategory": [
                            {
                                "name": 'Window Treatments',
                                "subcategory": [
                                    {
                                        "name": 'Window Stickers & Films',
                                        "last": True
                                    }
                                ]
                            }
                        ]
                    }
                ]
            }
        ]

I can’t get to wrap my head around it. Any help is appreciated. How can I convert the python list of list, to a list of dictionary items as shown above, at the same time doing the grouping? If possible at the end of the tree, indicating with a "last": True.

Asked By: Kjobber

||

Answers:

try this:

categories = [
        ['Sports & Outdoors', 'Outdoor Recreation', 'Skates, Skateboards & Scooters'],
        ['Toys & Games', 'Learning & Education', 'Science Kits & Toys'],
        ['Toys & Games', 'Arts & Crafts', 'Craft Kits'],
        ['Toys & Games', 'Arts & Crafts', 'Drawing & Painting Supplies', 'Crayons'],
        ['Home & Kitchen', 'Home Decor', 'Window Treatments', 'Window Stickers & Films']
    ]

new_categories = []
for category in categories:
    existing_category = next((c for c in new_categories if c["name"] == category[0]), None)
    if existing_category:
        new_category = existing_category
    else:
        new_category = {"name": category[0], "subcategory": []}
        new_categories.append(new_category)
    
    last_subcategory = new_category
    for subcategory in category[1:]:
        existing_subcategory = next((c for c in last_subcategory["subcategory"] if c["name"] == subcategory), None)
        if existing_subcategory:
            new_subcategory = existing_subcategory
        else:
            new_subcategory = {"name": subcategory, "subcategory": []}
            last_subcategory["subcategory"].append(new_subcategory)
        last_subcategory = new_subcategory
    last_subcategory["last"] = True


print(new_categories)
Answered By: Roniel López
Categories: questions Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.