I have a dictionary that looks like:
G={\'E\': 18.0, \'D\': 17.0, \'C\': 19.0, \'B\': 15.0, \'A\': 0}
I have to find the mean of the values
import numpy as np
np.mean(list(dict.values()))
If you use numpy:
import numpy as np
np.array(list(dict.values())).mean()
In Python 3.4 upwards there is a very clear way:
import statistics
numbers = [G[key] for key in G]
mean_ = statistics.mean(numbers)
To do this with a "simple for loop", using your constraints against using the dict methods:
G = {'E': 18.0, 'D': 17.0, 'C': 19.0, 'B': 15.0, 'A': 0}
count = 0
_sum = 0
for key in G:
count += 1
_sum += G[key]
print('this is the mean: ', _sum/count)
If you're supposed to avoid dict methods, clearly this is an academic exercise.
Without that constraint:
The statistics
module in the standard library has a mean
method, which would be my first thought (as the standard library does not require third party packages.):
>>> G={'E': 18.0, 'D': 17.0, 'C': 19.0, 'B': 15.0, 'A': 0}
>>> from statistics import mean
>>> mean(G[k] for k in G)
13.8
Third party packages like numpy and pandas have objects with a mean
method:
>>> from numpy import array
>>> array([G[k] for k in G]).mean()
13.8
>>> from pandas import Series
>>> Series([G[k] for k in G]).mean()
13.8
If we allow ourselves to use the values()
method, this gets a little simpler with iterable unpacking. For some reason the other answers violate that condition, so I figure I should show the more efficient way of doing it:
>>> Series([*G.values()]).mean()
13.8
Another for-loop, this one not needing a counter for items.
G = {'E': 18.0, 'D': 17.0, 'C': 19.0, 'B': 15.0, 'A': 0}
sum = 0
for k in G:
sum += float(G[k])
print "Mean: " + str(sum/len(G))
Results to:
Mean: 13.8
[Finished in 0.3s]
Actually, given your data, there's no need to use float
. On my end, removing float
and just leaving sum += G[k]
still outputs the same since the values are not strings anyway.
Iteration over a dictionary iterates over its keys. Try just using for key in G
, and then using G[key]
appropriately instead of values
.
Alternatively, use the iteritems()
method of the dictionary to get key, value
pairs from G, i.e.:
d=[float(sum(values)) / len(values) for key, values in G.iteritems()]
(For the record, your actual method of computing a mean doesn't look right to me, but you may as well fix the iteration problem first).