Home > Enterprise >  How to rearrange dictionary keys and values efficiently (according to this example)?
How to rearrange dictionary keys and values efficiently (according to this example)?

Time:09-14

I have a dictionary that is structured like so:

Current input:

current_dict = {'TP': {'class_A': 100,
                       'class_B': 200,
                       'class_C': 300},
                'FP' : {'class_A': 50,
                       'class_B': 60,
                       'class_C': 70},
                'FN' : {'class_A': 10,
                       'class_B': 20,
                       'class_C': 30}
                }

However, I would like every class to be the top-level key name and the values to contain the TP, FP, FN counts per class, like so:

Desired output:

desired_dict = {'class_A': {'TP' : 100, 'FP': 50, 'FN': 10},
                'class_B': {'FP' : 200, 'FP': 60, 'FN': 70},
                'class_C': {'FN' : 300, 'FP': 70, 'FN': 30},
                }

My current code creates the desired_dict default structure. Then I loop through the current_dict and check whether 'TP' and class name match to update the desired_dict default structure (something like this):

for k1,v1 in current_dict.items():
    for k2, v2 in v1.items():
        if k1 == 'TP' and v2=='class_A':
            desired_dict['class_A']['TP'].update(v2)

This is very inefficient as I would need to create many if statements to match class and count type. Any ideas on efficient ways to get the desired_dict? Is there a way to group these by classes A, B, C?

CodePudding user response:

Does this achieve what you want?

from pprint import pprint

current_dict = {'TP': {'class_A': 100,
                       'class_B': 200,
                       'class_C': 300},
                'FP' : {'class_A': 50,
                       'class_B': 60,
                       'class_C': 70},
                'FN' : {'class_A': 10,
                       'class_B': 20,
                       'class_C': 30}
                }

rearranged_dict = {}
# k is TP, FP, FN
for k, v in current_dict.items():
    # c is class_A, class_B
    for c, value in v.items():
        rearranged_dict.setdefault(c, {})[k] = value


pprint(rearranged_dict)

Output:

{'class_A': {'FN': 10, 'FP': 50, 'TP': 100},
 'class_B': {'FN': 20, 'FP': 60, 'TP': 200},
 'class_C': {'FN': 30, 'FP': 70, 'TP': 300}}
  • Related