JackR
JackR

Reputation: 165

Mean in a list with two element by item

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

Answers (4)

Antwane
Antwane

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

user26316
user26316

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

Tbaki
Tbaki

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

MSeifert
MSeifert

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

Related Questions