﻿ How to Calculate Average a Dictionary from List of Dictionary Data - ITCodar

# How to Calculate Average a Dictionary from List of Dictionary Data

## Get the average of dictionary values? [closed]

Okay, so let's iterate over all dictionary keys and average the items:

``avgDict = {}for k,v in StudentGrades.iteritems():    # v is the list of grades for student k    avgDict[k] = sum(v)/ float(len(v))``

In Python3, the `iteritems()` method is no longer necessary, can use `items()` directly.

now you can just see :

``avgDictOut: {'Ivan': 3.106666666666667, 'Martin': 4.816666666666666, 'Stoyan': 3.89, 'Vladimir': 5.433333333333334}``

From your question I think you're queasy about iteration over dicts, so here is the same with output as a list :

``avgList = []for k,v in StudentGrades.iteritems():    # v is the list of grades for student k    avgDict.append(sum(v)/ float(len(v)))``

Be careful though : the order of items in a dictionary is NOT guaranteed; this is, the order of key/values when printing or iterating on the dictionary is not guaranteed (as dicts are "unsorted").
Looping over the same identical dictionary object(with no additions/removals) twice is guaranteed to behave identically though.

## How to calculate an average from average values in a dictionary

You can take the values of your newly created dictionary using `.values` and then apply the same logic you applied earlier to get an average of averages.

``def avg(classes):    average = {}    for classnames, grades in classes.items():        average[classnames] = sum(grades) / len(grades)    return averageclasses = {"Spanish II": [100, 99, 100, 98], "US History I": [95, 96, 97, 94]}averages = avg(classes)#{'Spanish II': 99.25, 'US History I': 95.5}average_of_averages = sum(averages.values())/len(averages)#97.375``

## Get average value from list of dictionary

Just divide the sum of values by the length of the list:

``print sum(d['value'] for d in total) / len(total)``

Note that division of integers returns the integer value. This means that average of the `[5, 5, 0, 0]` will be `2` instead of `2.5`. If you need more precise result then you can use the `float()` value:

``print float(sum(d['value'] for d in total)) / len(total)``

## How to calculate the mean of elements of a lists inside a dictionary in python?

First: your example is not correct dictionary. You missed `{}` in some places.

You should have

``{    'NN3-001': {'diffe_1':[1,2,3,4],'mas_1':[10,20,30,40],'diffe_2':[5,6,7,8],'mas_2':[50,60,70,80]},    'NN3-002': {'diffe_1':[14,15,16,17],'mas_1':[100,200,300,400],'diffe_2':[18,19,20,21],'mas_2':[500,600,700,800]}}``

To get single list you can use

``values = data['NN3-001']['diffe_1'] ``

and you can calculate `mean`

``mean = sum(values)/len(values)``

For all list you have to use `for`-loops with `dict.items()`

``dictionary = {    'NN3-001': {'diffe_1':[1,2,3,4],'mas_1':[10,20,30,40],'diffe_2':[5,6,7,8],'mas_2':[50,60,70,80]},    'NN3-002': {'diffe_1':[14,15,16,17],'mas_1':[100,200,300,400],'diffe_2':[18,19,20,21],'mas_2':[500,600,700,800]}}for name, values in dictionary.items():    print('=== time serie:', name, '===')    for key, data in values.items():        print('  key:', key)        print(' data:', data)        print(' mean:', sum(data)/len(data))        print('---')``

Result:

``=== time serie: NN3-001 ===  key: diffe_1 data: [1, 2, 3, 4] mean: 2.5---  key: mas_1 data: [10, 20, 30, 40] mean: 25.0---  key: diffe_2 data: [5, 6, 7, 8] mean: 6.5---  key: mas_2 data: [50, 60, 70, 80] mean: 65.0---=== time serie: NN3-002 ===  key: diffe_1 data: [14, 15, 16, 17] mean: 15.5---  key: mas_1 data: [100, 200, 300, 400] mean: 250.0---  key: diffe_2 data: [18, 19, 20, 21] mean: 19.5---  key: mas_2 data: [500, 600, 700, 800] mean: 650.0``

EDIT:

After changes in question I see that you need `zip(diffe_1, diffe_2)` to create pairs.

``dictionary = {    'NN3-001': {'diffe_1':[1,2,3,4],'mas_1':[10,20,30,40],'diffe_2':[5,6,7,8],'mas_2':[50,60,70,80]},    'NN3-002': {'diffe_1':[14,15,16,17],'mas_1':[100,200,300,400],'diffe_2':[18,19,20,21],'mas_2':[500,600,700,800]}}result = {}for name, values in dictionary.items():    print('=== time serie:', name, '===')        result[name] = {'diff':[], 'mas':[]}        print('--- diffe_1, diffe_2 ---')    for a, b in zip(values['diffe_1'],values['diffe_2']):        mean = int( (a+b)/2 )        print(a, '&', b, '=>', mean)        result[name]['diff'].append(mean)            print('--- mas_1, mas_2 ---')    for a, b in zip(values['mas_1'],values['mas_2']):        mean = int( (a+b)/2 )        print(a, '&', b, '=>', mean)        result[name]['mas'].append(mean)print(result)      ``

gives

``=== time serie: NN3-001 ===--- diffe_1, diffe_2 ---1 & 5 => 3.02 & 6 => 4.03 & 7 => 5.04 & 8 => 6.0--- mas_1, mas_2 ---10 & 50 => 30.020 & 60 => 40.030 & 70 => 50.040 & 80 => 60.0=== time serie: NN3-002 ===--- diffe_1, diffe_2 ---14 & 18 => 16.015 & 19 => 17.016 & 20 => 18.017 & 21 => 19.0--- mas_1, mas_2 ---100 & 500 => 300.0200 & 600 => 400.0300 & 700 => 500.0400 & 800 => 600.0{'NN3-001': {'diff': [3, 4, 5, 6], 'mas': [30, 40, 50, 60]},  'NN3-002': {'diff': [16, 17, 18, 19], 'mas': [300, 400, 500, 600]}}``

You may also use loop `for prefix in ['diffe', 'mas']:` to reduce code.

``dictionary = {    'NN3-001': {'diffe_1':[1,2,3,4],'mas_1':[10,20,30,40],'diffe_2':[5,6,7,8],'mas_2':[50,60,70,80]},    'NN3-002': {'diffe_1':[14,15,16,17],'mas_1':[100,200,300,400],'diffe_2':[18,19,20,21],'mas_2':[500,600,700,800]}}result = {}for name, values in dictionary.items():    print('=== time serie:', name, '===')            result[name] = {}        for prefix in ['diffe', 'mas']:        print('--- prefix:', prefix, '---')                result[name][prefix] = []        for a, b in zip(values[prefix+'_1'],values[prefix+'_2']):            mean = int( (a+b)/2 )            print(a, '&', b, '=>', mean)            result[name][prefix].append(mean)        print(result)``

## Average of key values in a list of dictionaries

You can use `zip` and `numpy` functions `mean` and `round` for this task:

``In : import numpy as npIn :  [dict(zip(d.keys(), [int(np.round(np.mean(d.values())))])) for d in L]#Out: [{'Eva': 5}, {'Ana': 53}, {'Ada': 12}]``

Version with "less" parenthesis:

``[dict(zip(d.keys(), [np.array(d.values()).mean().round().astype(int)])) for d in L]``

## average list of dictionaries in python

You can use the following

``sum([item['Weight'] for item in data])/len(data)``

and use

``float(len(data)) ``

if you want a more exact value.

## Python - Find average in dict elements

You could create an intermediate dictionary that collects all encountered values as lists:

``dct = [{'a':2, 'b':3}, {'b':4}, {'a':1, 'c':5}]from collections import defaultdictintermediate = defaultdict(list)for subdict in dct:    for key, value in subdict.items():        intermediate[key].append(value)# intermediate is now: defaultdict(list, {'a': [2, 1], 'b': [3, 4], 'c': })``

And finally calculate the average by dividing the sum of each list by the length of each list:

``for key, value in intermediate.items():    print(key, sum(value)/len(value))``

which prints:

``b 3.5c 5.0a 1.5``

## Average each dictionary list value

Assuming you meant for each value in the dictionary to be a list of numbers, here's a way to do what you're asking:

``d = { "numbers1" : [4,5,6,3,2] , "numbers2" : [40,5,63,2] , "numbers3" : [10,25,96,3]}avg = {k: sum(v) / len(v) for k, v in d.items()}print(avg)sortedAvg = sorted(d.items(), key=lambda x: sum(x) / len(x))print(sortedAvg)``

Output:

``{'numbers1': 4.0, 'numbers2': 27.5, 'numbers3': 33.5}[('numbers1', [4, 5, 6, 3, 2]), ('numbers2', [40, 5, 63, 2]), ('numbers3', [10, 25, 96, 3])]``

Explanation:

• `avg` uses a dict comprehension to create a dictionary with the same keys as the input containing the average of each key's list
• `sortedAvg` uses a list comprehension to create a list of tuples of key/value pairs in the input dict sorted in the order of ascending average.