与列表中数字的最大偏差

时间:2013-07-29 02:59:36

标签: python

如何创建函数来查找平均值和最大偏差(平均值与列表中的另一个数字之间的最高#)?

如果列表为[1,6,8],则应打印出最大偏差为4且平均值为5.

然后我应该使用这两个值作为输出它们的参数来编写另一个函数。

我的代码出了什么问题?我知道我应该使用.sort来获得最大偏差,但我不确定究竟是怎么做的。

假设我已在前一个函数中输出了mylist:def list_output(mylist)

def code(avg,max_dev):
    avg = sum(mylist)/len(mylist)
    max_dev = ????????
    return avg
    return max_dev

def main_output(avg,max_dev):
    print "The average is", avg, "The maximum deviation is", max_dev
main_output(code(avg, max_dev))

4 个答案:

答案 0 :(得分:2)

你可以这样做:

a = [1,6,8]
avg = sum(a, 0.0) / len(a)
max_dev = max(abs(el - avg) for el in a)

答案 1 :(得分:1)

您的问题的其他答案在整个列表中循环三次。一次计算平均值,一次计算列表的最大值和最小值。您可以通过单个循环实现相同的目标:

def avg_max_dev(num_list):
    total = 0
    minimum = maximum = num_list[0]
    for n in num_list:
        total += n
        if n < minimum:
            minimum = n
        elif n > maximum:
            maximum = n
    avg = total / len(num_list)  # float(total) on Python2
    max_dev = max(avg - minimum, maximum - avg)
    return avg, max_dev

编辑: @Slater Tyranus正确批评使用手写循环而不是快速且易于实现的函数summin和{{ 1}}。

我在Python3.3上测试了IPython中两个函数的性能,在Slater Tyranus'max函数中删除了浮点数。

calculate

答案 2 :(得分:0)

我会建议这样的事情来找到最大偏差,因为你知道它将是最小数字和平均值之间的差异,或者是最大数字和平均值。

max_dev = max([max(num_list)-avg, avg-min(num_list)])

尽管如此,您的代码仍然存在问题。

请记住,函数的输入与输出不同,因此第一个定义行:

def code(avg,max_dev):

应该更像是:

def code(num_list):

因为你想根据num_list计算东西。

此外,您计算平均值的行非常容易受到浮动除法问题的影响,因此不要说:

avg = sum(mylist)/len(mylist)

我会添加一个浮动转换:

avg = float(sum(num_list))/len(num_list)

另外,在一个函数中只能有一个return语句,所以如果你想这样做,你需要将两个值一起返回,如下所示:

return (avg, max_dev)

总的来说,我会按如下方式重写你的函数:

def calculate(num_list):
    avg = float(sum(num_list))/len(num_list)
    max_dev = max([max(num_list)-avg, avg-min(num_list)])
    return avg, max_dev

def main_output(avg, max_dev):
    print "The average is: ", avg, " and the maximum deviation is: ", max_dev

答案 3 :(得分:0)

max dev是平均值和最小值之间的差值和最大值之间的较大值。你可以这样做......

max_dev = max((avg - min(mylist), max(my_list) - avg)

全局变量通常不是一个好主意,因此我建议将my_list作为参数传递给您的函数。

为了从函数返回2个值,您应该创建2的元组并返回两者。像这样......

def code(my_list):
    #code goes here
    my_avg = ...
    my_max_dev = ...
    return (my_avg, my_max_dev)

你可以像这样调用你的代码......

avg, max_dev = code(my_list)

您还应该有一些逻辑来确保您的列表只包含数字,否则您可能会得到意想不到的结果!