2017-06-01 3 views
1

I ont une liste:valeurs Somme dans les listes imbriquées python

l = [['a', 10, 30], ['b', 34, 89], ['c', 40, 60],['d',30,20]] 

où le premier élément à l'intérieur de chaque sous-liste est le nom et d'autres

deux nombres sont des marques (SUB1 et SUB2) Les listes imbriquées peuvent être dynamique, c'est-à-dire que le nombre de listes imbriquées peut changer selon la fonction.

Ce que je cherche est de trouver

average of subj 1 i.e (10+34+40+30)/4 and 
similarly sub2 (30+89+60+20)/4 

also average marks of a: (10+30)/2 
average marks of b: (34+89)/2 and so on. 

J'ai essayé:

c = 0 
for i in range(0,len(list_marks1)): 
    c += list_marks1[i][1] 
sub_1avg = float(c)/len(list_marks1) 
d = 0 
for i in range(0,len(list_marks1)): 
    d += list_marks1[i][2] 
sub_2avg = float(d)/len(list_marks1) 

mais ce n'est pas correct.

Existe-t-il un moyen optimal de le faire? Comme le nombre de sujets dans mes listes imbriquées peut également changer.

+0

vous devriez envisager d'utiliser 'dictionary' à la place pour un type de données * éventuellement * plus complexe – TheDarkKnight

Répondre

4

Vous pouvez simplement utiliser sum et une expression du générateur:

>>> l= [['a', 10, 30], ['b', 34, 89], ['c', 40, 60],['d',30,20]] 
>>> length = float(len(l)) # in Python 3 you don't need the "float" 
>>> sum(subl[1] for subl in l)/length 
28.5 
>>> sum(subl[2] for subl in l)/length 
49.75 

Ou même le faire dans une compréhension de la liste:

>>> [sum(subl[subj] for subl in l)/length for subj in range(1, 3)] 
[28.5, 49.75] 

De même pour la moyenne d'une sous-liste:

>>> length = float(len(l[0])) - 1 
>>> [sum(subl[1:])/length for subl in l] 
[20.0, 61.5, 50.0, 25.0] 

Lorsque vous avez python 3.4 ou plus récent, vous pouvez remplacer le sum/length avec statistics.mean:

>>> from statistics import mean 
>>> [mean(subl[subj] for subl in l) for subj in range(1, 3)] 
[28.5, 49.75] 

>>> [mean(subl[1:]) for subl in l] 
[20, 61.5, 50, 25] 

Vous avez demandé au sujet de la meilleure façon, donc je devrais probablement mentionner qu'il ya des packages dédiés pour les données tabulaires. Par exemple, si vous avez pandas il est encore plus facile l'utilisation DataFrame et mean:

>>> import pandas as pd 

>>> df = pd.DataFrame(l, columns=['name', 'x', 'y']) 
>>> df[['x', 'y']].mean(axis=0) 
x 28.50 
y 49.75 
dtype: float64 

>>> df[['x', 'y']].mean(axis=1) 
0 20.0 
1 61.5 
2 50.0 
3 25.0 
dtype: float64 
0

Une approche fucnitonal:

l= [['a', 10, 30], ['b', 34, 89], ['c', 40, 60],['d',30,20]] 
map(lambda x: sum(x)/float(len(x)), zip(*l)[1:]) 
[28.5, 49.75] 

De cette façon, travaillera pour toute la longueur du sous-liste

0
l= [['a', 10, 30], ['b', 34, 89], ['c', 40, 60],['d',30,20]] 
sub1_avg = sum(n for _,n, _ in l)/float(len(l)) 
sub2_avg = sum(n for _,_, n in l)/float(len(l)) 
student_avgs = [{x[0]: sum(x[1:])//float((len(x)-1))} for x in l] 
print "Sub1 avg - {}\nSub2 avg - {}\nstudent avg - {}".format(sub1_avg, sub2_avg, student_avgs) 
de sortie

exemple

Sub1 avg - 28.5 
Sub2 avg - 49.75 
student avg - [{'a': 20.0}, {'b': 61.0}, {'c': 50.0}, {'d': 25.0}]