【问题标题】:average of the list in PythonPython中列表的平均值
【发布时间】:2010-12-05 08:19:30
【问题描述】:

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

首先,我们找到两个元素的平均值,三个元素.....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)

其实这是作业的一部分,但我不知道如何解决。

【问题讨论】:

    标签: python list average


    【解决方案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时返回平均值。

    【讨论】:

    • .....首先跟踪运行总和(例如,如果列表为 [-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]..... 你是怎么计算出来的?如果你能解释一下,我会很高兴。
    • @user465137:真实列表中的第一个元素是-1,所以你将-1附加到结果列表中;然后取第二个元素4,将其添加到-1,得到3,将3附加到结果列表中;然后取第三个元素 8,将其添加到 3,得到 11,将 11 附加到结果列表中;然后取第四个元素 1,将其添加到 11 得到 12,将 12 附加到结果列表中。现在结果列表包含 [-1, 3, 11, 12]。
    • 我尝试为 [-1 + 4]、[-1 + 4 + 8]、[-1 + 4 +8 +1] 编写代码,但我所有的尝试都以失败告终。如果可以的话,请帮忙
    • @user465137:复制并粘贴您的问题,以便它包含您尝试过的内容,即使它是错误的。我们将帮助指出您的错误所在。
    • 你好@user465137(哦,请找一个别名),看看我下面的回答,我相信它会帮助你......你的问题是试图从头开始计算每个元素。相反,在将下一个元素保存到数组后,将其添加到总和中。如果您这样想,第一个元素包含元素 1 到 1 的总和。如果将此添加到第二个元素,它现在包含输入列表的元素 1-2 的总和,将其添加到第三个元素,它包含输入列表的元素 1-3 的总和,依此类推。
    【解决方案3】:

    首先我会给你一个解释,然后是一些你必须用 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
    

    【讨论】:

    • 我最初写了一个完整的答案,但认为你不会从中学到很多东西。上面写着“将平均值计算到索引 0 到长度 - 2 的列表中”的评论是供您填写的。如果您遇到困难,请告诉我,我会提示给您。祝你好运。
    【解决方案4】:

    这也是一个使用python 3.x的机会itertools.accumulate

    来自文档:

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

    【讨论】:

      猜你喜欢
      • 2016-06-14
      • 1970-01-01
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      • 1970-01-01
      • 2017-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多