Reputation: 165
I actually work with Google Chart API and Flask. I retrieve data from my database and after that I add them in my list.
My list:
[['Swimming', 4], ['Football', 4], ['Football', 2]], [['Swimming', 2]
I want to get for example the mean for 'Football'
so have ['Football', 3]
. The same for 'Swimming'
. So the expected output would be:
[['Swimming', 4], ['Football', 3]]
How can I do that?
Code :
def get_quotation_by_activity(self, id_child):
cursor = self.link.cursor()
try:
cursor.execute("SELECT previous_activity, quotation FROM sessions, sessions_questions_asked WHERE sessions.id = sessions_questions_asked.id_session AND child=%s;", [id_child]);
quotation_activity = []
quotation_activity_mean = []
for row in cursor:
quotation_activity.append([row[0], row[1]])
except (Exception, psycopg2.DatabaseError) as error:
print(error)
return []
print(quotation_activity)
#Some tests..
'''for i in quotation_activity:
activity = i[0]
quotation = i[1]
if not i in quotation_activity_mean:
quotation_activity_mean.append(i)'''
print(quotation_activity_mean)
return quotation_activity
@app.route("/statistics")
def stats():
quotation_activity = db.get_quotation_by_activity(6)
return render_template('statistics.html', quotation_activity= quotation_activity)
Upvotes: 1
Views: 62
Reputation: 22698
You can use a dict as temp variable:
values = [['Swimming', 4], ['Football', 4], ['Football', 2], ['Swimming', 2]]
result = {}
for activity, quotation in values:
if activity in result:
result[activity].append(quotation)
else:
result[activity] = [quotation]
final_result = [[name, sum(quotations) / len(quotations)] for name, quotations in result.items()]
print(final_result)
Returns:
[['Swimming', 3.0], ['Football', 3.0]]
Upvotes: 2
Reputation: 39
import numpy as np
#initialize list
your_list = [['Swimming', 4], ['Football', 4], ['Football', 2]], [['Swimming', 2]]
#initialize dict
temp_dict = {}
for items in your_list:
for item in items:
temp_dict.update({item[0]:[]})
#put values into dict
for items in your_list:
for item in items:
temp_list = temp_dict[item[0]]
temp_list.append(item[1])
temp_dict[item[0]] = temp_list
#generate new list
new_list = []
for key in temp_dict:
new_list.append((key, int(np.average(temp_dict[key]))))
Upvotes: 0
Reputation: 1003
You can use defaultdict:
a = [['Swimming', 4], ['Football', 4], ['Football', 2], ['Swimming', 2]]
from collections import defaultdict
d = defaultdict(lambda :0)
d_count = defaultdict(lambda :0)
for i in a:
d[i[0]] +=i[1]
d_count[i[0]] +=1
d_resultat = {}
for k,v in d.items():
d_resultat[k] = v/d_count[k]
d_resultat
output :
{'Football': 3.0, 'Swimming': 3.0}
Upvotes: 1
Reputation: 152870
You could use a defaultdict
to collect the values associated with one "kind" and then calculate the mean in a list comprehension. However the order of the elements in the final list is undefined because the defaultdict
is unordered:
from collections import defaultdict
inp = [['Swimming', 4], ['Football', 4], ['Football', 2], ['Swimming', 2]]
dct = defaultdict(list)
for item in inp:
name, value = item
dct[name].append(value)
print([[name, sum(values) / len(values)] for name, values in dct.items()])
# [['Swimming', 3.0], ['Football', 3.0]]
Upvotes: 2