Search code examples
pythondictionary

How to combine complex dicts in list of complex dicts where key appears multiple times


I have a list of dicts, where each dict refers to a team and its assets.

e.g.

list_of_dicts = [
    {
        "team": "X",
        "description": "A description of X",
        "types": [
            {
                "type": "TYPEA",
                "assets": {
                    "high_value": [
                        {"id": "asset_1_id", "name": "asset_1_name"},
                        {"id": "asset_2_id", "name": "asset_2_name"},
                    ],
                    "low_value": [
                        {"id": "asset_3_id", "name": "asset_3_name"},
                        {"id": "asset_4_id", "name": "asset_4_name"},
                    ],
                },
            },
            {
                "type": "TYPEB",
                "assets": {
                    "high_value": [
                        {"id": "asset_1_id", "name": "asset_1_name"},
                        {"id": "asset_2_id", "name": "asset_2_name"},
                    ],
                    "low_value": [
                        {"id": "asset_3_id", "name": "asset_3_name"},
                        {"id": "asset_4_id", "name": "asset_4_name"},
                    ],
                },
            },
        ],
    },
    {
        "team": "X",
        "description": "A description of X",
        "types": [
            {
                "type": "TYPEC",
                "assets": {
                    "high_value": [
                        {"id": "asset_1_id", "name": "asset_1_name"},
                        {"id": "asset_2_id", "name": "asset_2_name"},
                    ],
                    "low_value": [
                        {"id": "asset_3_id", "name": "asset_3_name"},
                        {"id": "asset_4_id", "name": "asset_4_name"},
                    ],
                },
            }
        ],
    },
]

Where here, there are 2 dicts for team X, with different Types (TYPEA and TYPEB, then another with TYPEC), there will also be 2 dicts for Team Y, maybe 3 for team Z etc.

My desired outcome, is to have a list of dicts, where there is only 1 dict for Team X, that has Type A, B and C together.

*Have not listed desired outcome as makes for very long example. Happy to add.

Would look something like:

list_of_dicts = [
    {
        "team": "X",
        "description": "A description of X",
        "types": [
            {
                "type": "TYPEA",
                "assets": {...},
            {,
            {
                "type": "TYPEB",
                "assets": {...},
            {,
            {
                "type": "TYPEC",
                "assets": {...},
            {,
        ],
    },
]

Solution

  • Create a dictionary whose keys are the team names. Then loop through your list of dictionaries, using this to merge the types lists for the same team.

    result_dict = {}
    
    for d in list_of_dicts:
        if d['team'] in result_dict:
            result_dict[d['team']]['types'].extend(d['types'])
        else:
            result_dict[d['team']] = d
    
    list_of_dicts = list(result_dict.values())