Python中列表的平均值
我遇到一个问题:我需要用一种方法来计算一个列表的平均值:
首先,我们要找出两个元素、三个元素……一直到列表中所有元素的平均值,然后用这些平均值形成一个新列表。接着使用 .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 个回答
这也是一个使用 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]
把这个列表当作函数的输入。如果列表里只有一个元素,就直接返回这个元素。然后从这个列表中创建两个迭代器。把其中一个迭代器里的一个元素取出来,和另一个迭代器里的元素配对在一起,接着计算这些配对的平均值。然后再重复这个过程。
简单来说,你是在从一串数字中找出“运行平均值”。
这里使用递归会很有帮助。当列表的长度为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时返回平均值。