Python中列表的平均值

2 投票
4 回答
3449 浏览
提问于 2025-04-16 08:03

我遇到一个问题:我需要用一种方法来计算一个列表的平均值:

首先,我们要找出两个元素、三个元素……一直到列表中所有元素的平均值,然后用这些平均值形成一个新列表。接着使用 .pop() 方法,再次计算所有的平均值。这个过程应该在列表的长度变成2时停止。需要使用递归。

举个例子: 列表: [-1, 4, 8, 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

这也是一个使用 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]
3

把这个列表当作函数的输入。如果列表里只有一个元素,就直接返回这个元素。然后从这个列表中创建两个迭代器。把其中一个迭代器里的一个元素取出来,和另一个迭代器里的元素配对在一起,接着计算这些配对的平均值。然后再重复这个过程。

2

简单来说,你是在从一串数字中找出“运行平均值”。

这里使用递归会很有帮助。当列表的长度为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时返回平均值。

撰写回答