Python中列表的平均值

时间:2010-12-05 08:19:31

标签: python list average

我遇到了一个问题:我需要使用此方案找到列表的平均值:

首先,我们找到平均两个元素,三个元素..... len(list)元素,并使用平均值形成一个新列表。使用.pop()并再次查找所有平均值。函数应在len(list) == 2时停止。应该使用递归。

实施例: 列表:[-1, 4, 8, 1]

1步:

  • 找到[-1, 4], [-1, 4, 8], [-1, 4, 8, 1]
  • 的平均值
  • 然后我们形成一个新列表:[1.5, 3.66..., 3](平均值)
  • 然后找到新列表的平均值:[1.5, 3.66...], [1.5, 3.66..., 3]
  • 然后我们形成一个新列表:[2.5833.., 7.222...](平均值)
  • len(list) == 2时,找到这两个元素的平均值。

答案是2.652777

我应该写什么:

jada = []

while True:    
    print 'Lst elements:'    
    a = input()
    if (a == ''):    
        break    
    jada.append(a)

print 'Lst is:' + str(Jada)

def keskmine(Jada):
    for i in range(len(Jada) - 1):
        ...

    jada.pop()
    return keskmine(Jada)

实际上,这是家庭作业的一部分,但我不知道如何解决它。

4 个答案:

答案 0 :(得分:3)

接受列表作为函数参数。如果列表中有一个项目,则返回该项目。从列表中创建两个迭代器。从其中一个列表中弹出一个项目,将它们压缩在一起,然后找到zip结果的平均值。递归。

答案 1 :(得分:2)

简而言之,您从数字列表中找到了“平均值”。

使用递归在这里会有所帮助。当“len(lst)== 1”时返回唯一的元素,否则,计算运行平均值并递归。

此作业分为两部分。首先,您需要将[-1,4,8,1]等列表转换为[1.5,3.66,3]等列表(查找运行平均值)。其次,您需要使用运行平均值的结果重复此过程,直到列表的长度为2(或1)。

您可以独立于第二个问题解决第一个问题(找到运行平均值)。找到运行平均值很简单,首先跟踪运行总和(例如,如果列表为[-1,4,8,1],运行总和为[-1,3,11,12])并划分每个元素通过各自的运行指数(即只需[1,2,3,4])得到[-1 / 1,3 / 2,11 / 3,12 / 4] = [-1,1.5,3.66,3] 。然后你可以丢弃第一个元素来获得[1.5,3.66,3]。

使用递归可以轻松解决第二个问题。递归只是另一种循环形式,所有递归代码都可以转换为常规for / while循环代码,所有循环代码都可以转换为递归代码。然而,一些问题在递归或循环中倾向于更“自然”的解决方案。在我看来,使用递归更自然地解决了第二个问题(重复运行平均值的过程)。假设你已经解决了第一个问题(找到了运行平均值),我们有一个函数runavg(lst)来解决第一个问题。我们想编写一个重复找到lst运行平均值的函数,或者在lst的长度为2时返回平均值。

答案 2 :(得分:0)

这也是使用python 3.x itertools.accumulate

的机会

来自docs:

>>> list(accumulate(8, 2, 50))

[8, 10, 60]

然后,你只需要将每个项目除以其索引增加1,消除第一个元素并重复直到完成

例如,这适用于任何长度的任何列表,在列表解析中执行上述大多数步骤:

>>> from itertools import accumulate
>>> a = [-1, 4, 8, 1]
>>> while len(a) > 1:
    a = [item / (index + 1) for (index, item) in enumerate(accumulate(a)) if index > 0]

>>> print(a)
[2.6527777777777777]

答案 3 :(得分:0)

首先我会给你一个解释,然后是一些伪代码,你必须在Python中重写。主要思想是让一个函数调用自身,每次迭代都会传递一个较小的问题。在这种情况下,您希望将项目数减少1。

您可以为每次通话创建一个新列表,也可以根据需要重复使用相同的列表。在将列表传递给下一次迭代之前,您需要计算平均值,从而创建更短的列表。

我们的想法是,您将参数中的数字相加,然后将您目前添加的项目数除以列表中的相应索引。完成后,您可以弹出最后一项。

代码看起来像这样:(样本中的索引基于零)

average(list[])
    if(list.length == 0)  // Check input and handle errors
        exit
    if(list.length == 1)  // Recursion should stop
        return list[0]    // The one item is it's own average!
    // calculate the averages into the list in indices 0 to length - 2
    list.pop()                       // remove the last value
    return average(list)             // the recursion happens here