如何编写一个取数字列表平均值的函数

时间:2014-09-29 22:37:31

标签: function for-loop python-3.x average

我想避免导入不同的模块,因为这主要是我在网上看到的。我对这段代码感到困惑,而且我真的不知道如何解决它或改进它。这是我到目前为止所做的事情。

def avg(lst):
    '''lst is a list that contains lists of numbers; the
    function prints, one per line, the average of each list'''
    for i[0:-1] in lst:
        return (sum(i[0:-1]))//len(i)

同样,我很新,这对于循环术语对我来说非常困惑,所以如果有人可以帮助我这样做,那么等级列表的输出将是包含平均值的不同行。因此,如果lst我插入了grades = [[95,92,86,87], [66,54], [89,72,100], [33,0,0]],那么它将有4行,这些行都具有这些子列表的平均值。我还要在函数中假设子列表可以有任何等级,但我可以假设列表具有非零值。

Edit1:@ jramirez,你能解释一下与我的不同之处吗?我不怀疑它会更好还是它会起作用,但我仍然不知道如何重新创建这个......不管怎样,谢谢。

2 个答案:

答案 0 :(得分:0)

我认为这就是你想要的:

def grade_average(grades):
    for grade in grades:
        avg = 0
        for num in grade:
            avg += num

        avg = avg / len(grade)

        print ("Average for " + str(grade) + " is = " + str(avg))

if __name__ == '__main__':
    grades = [[95,92,86,87],[66,54],[89,72,100],[33,0,0]]    
    grade_average(grades)

结果:

Average for [95, 92, 86, 87] is = 90.0

Average for [66, 54] is = 60.0

Average for [89, 72, 100] is = 87.0

Average for [33, 0, 0] is = 11.0

答案 1 :(得分:0)

代码问题:i的无关索引;使用//截断他的平均值(如果你想围绕它,可以使用圆形);并且在循环中使用return,所以它会在第一次平均后停止。你的docstring说“打印”,但你会返回。这实际上是件好事。函数不应打印他们计算的结果,因为这使得答案无法进一步计算。以下是我作为生成器函数编写的内容。

def averages(gradelists):
'''Yield average for each gradelist.'''
for glist in gradelists:
    yield sum(glist) /len(glist)

print(list(averages(
        [[95,92,86,87], [66,54], [89,72,100], [33,0,0]])))

[90.0, 60.0, 87.0, 11.0]

要返回列表,请将函数体更改为(初学者版)

ret = []
for glist in gradelists:
    ret.append(sum(glist) /len(glist))
return ret

或(更高级,使用列表理解)

return [sum(glist) /len(glist) for glist in gradelists]

但是,我真的建议学习迭代器,生成器和生成器函数(用yield定义)。