0

我如何制作一个函数来找到平均值和最大偏差(平均值和列表中另一个数字之间的最高#)?

如果列表是 [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

4 回答 4

3

你可以这样做:

a = [1,6,8]
avg = sum(a, 0.0) / len(a)
max_dev = max(abs(el - avg) for el in a)
于 2013-07-29T13:24:21.343 回答
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并且max.

我在 Python3.3 上测试了我们在 IPython 中的两个函数的性能,放弃了 Slater Tyranus 函数中的浮点转换calculate

In [25]: from random import randrange

In [26]: nums = [randrange(200) for _ in range(10**6)]

In [27]: %timeit avg_max_dev(nums)
10 loops, best of 3: 159 ms per loop

In [28]: %timeit calculate(nums)
10 loops, best of 3: 77.5 ms per loop

In [50]: # Edit: @Jon Clement's solution

In [51]: def jon_clements(num_list):
    avg = sum(num_list) / len(num_list)
    max_dev = max(abs(el - avg) for el in num_list)
    return avg, max_dev
   ....: 

In [52]: %timeit jon_clements(nums)
1 loops, best of 3: 250 ms per loop
于 2013-07-29T03:55:04.370 回答
0

最大开发将是平均值和最小值与最大值之间的差值中的较大者。你可以做这样的事情......

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)

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

于 2013-07-29T03:22:02.470 回答
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
于 2013-07-29T03:02:27.397 回答