2017-06-01 105 views
1

我有一個列表:和值蟒蛇

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

其中每個子列表中的第一個產品的名稱和另外兩個號碼都標記(SUB1和SUB2)

嵌套表可以是動態的,即嵌套列表的數量可以根據功能而改變。

我所尋找的是找到

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. 

我想:

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) 

,但這是不正確的。

有沒有最佳的方法來做到這一點?由於我的嵌套列表中的主題數量也可以改變。

+0

你應該考慮使用'dictionary'代替*可能*更復雜的數據類型 – TheDarkKnight

回答

4

你可以只使用sum和發電機的表達:

>>> 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 

甚至做一個列表解析裏:

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

同樣,對於平均一個子列表:

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

當你有python 3.4或更新版本時,你可以替換sum/lengthstatistics.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] 

你問到的最好辦法,所以我也許應該提到,有專用表格數據包。例如,如果您有pandas它使用DataFramemean更簡單:

>>> 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

一個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] 

這種方式適用於任何子列表長度

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) 

樣本輸出工作

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