Search code examples
dictionary-comprehensionnormalize

Normalize Probability using Dictionary Comprehension


My python dictionary looks like

probabilities = {'harry': {'gene': {0: 0.23, 1: 0.09, 2: 0.13}, 'trait': {False: 0.23, True: 0.32}},
 'jim': {'gene': {0: 0.12, 1: 0.15, 2: 0.56}, 'trait': {False: 0.67, True: 0.12}}}

I normalize it by writing code like

for person in probabilities:
        for attribute in probabilities[person]:
            denominator = sum(probabilities[person][attribute].values())
            for value in probabilities[person][attribute]:
                probabilities[person][attribute][value] /= denominator

Code is alright as it perfectly normalizes the probabilities. But can I do the same thing using dictionary comprehension? If so, how? If not, why?


Solution

  • A bit of effort brings me to:

    probabilities = {'harry': {'gene': {0: 0.23, 1: 0.09, 2: 0.13}, 'trait': {False: 0.23, True: 0.32}},
                     'jim': {'gene': {0: 0.12, 1: 0.15, 2: 0.56}, 'trait': {False: 0.67, True: 0.12}}}
    
    probabilities_new = {
        p: {
            k: {
                k_inn: v_inn / sum(v.values())
                for k_inn, v_inn in v.items()
            }
            for k, v in a.items()
        }
        for p, a in probabilities.items()
    }