Reputation: 383
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 e.g. mean(18,17,19,15,0) using a simple for
loop without using built in functions like .values()
, .items()
and so on. I tried the following but am getting an error:
d=[float(sum(values)) / len(values) for key, values in G]
return (d)
ValueError: need more than 1 value to unpack
Can someone help me fix this????
Upvotes: 11
Views: 63923
Reputation: 2437
Suppose you have a dictionary with multiple keys, each having a list of values:
your_averaged_dictionary = {key: np.mean(values) for key, values in your_dictionary}
Upvotes: 0
Reputation: 395543
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
Upvotes: 12
Reputation: 161
If you use numpy:
import numpy as np
np.array(list(dict.values())).mean()
Upvotes: 16
Reputation: 6363
What I suggest instead of the current answers is adopting a functional programming paradigm that is reusable and flexible. For example, creating a function to calculate any statistic on list
values contained within a simple dict
:
def summarize_dict(dictionary, function):
dict_new = {}
for k,v in dictionary.items():
dict_new[k] = function(v)
return dict_new
Testing:
import numpy as np
keys = ["a","b","c","d","e"]
values = [range(2),range(4),range(6),range(8),range(10)]
dictionary = dict(zip(keys, values))
summarize_dict(dictionary, np.mean)
Yields:
{'a': 0.5, 'b': 1.5, 'c': 2.5, 'd': 3.5, 'e': 4.5}
Upvotes: 1
Reputation: 14179
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.
Upvotes: 0
Reputation: 1124
In Python 3.4 upwards there is a very clear way:
import statistics
numbers = [G[key] for key in G]
mean_ = statistics.mean(numbers)
Upvotes: 4
Reputation: 7842
You want:
mean = sum([G[key] for key in G])/float(len(G))
Your original code will also produce a:
TypeError: 'int' object is not iterable
when you try to sum the values.
Upvotes: 1
Reputation: 8844
Use G.values()
to get all the values from a dictionary.
G = {'E': 18.0, 'D': 17.0, 'C': 19.0, 'B': 15.0, 'A': 0}
d = float(sum(G.values())) / len(G)
print (d)
This prints 13.8
.
Note that there is a difference between Python 2 and Python 3 here. In Python 2, G.values()
is a newly constructed list of values. In Python 3, it is a generator, which can be thought of as a “lazy list”. The same thing is called G.itervalues()
in Python 2.
Upvotes: 4
Reputation: 13955
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).
Upvotes: 4