想要找到一种计算多个列表平均值的方法。

6

假设我们在Python中创建了以下列表:

[[1, 2, 3], [1, 3, 4], [2, 4, 5]]

我想先将1+1+2相加并除以3,得到该元素的平均值,并将其存储在一个新列表中。然后重复这个步骤,分别对第二个和第三个元素进行操作。有没有简洁的方法可以做到这一点?(我无法想到除了多个循环之外的其他方法)

输出应该是一个新列表[(1+1+2), (2+3+4), (3+4+5)]

非常感谢!


可能是重复的问题:python求多个列表的平均值 - Nikana Reklawyks
2个回答

14

平均数:

>>> data = [[1, 2, 3], [1, 3, 4], [2, 4, 5]]
>>> from __future__ import division
>>> [sum(e)/len(e) for e in zip(*data)]
 [1.3333333333333333, 3.0, 4.0]

总和:

>>> data = [[1, 2, 3], [1, 3, 4], [2, 4, 5]]
>>> [sum(e) for e in zip(*data)]
 [4, 9, 12]

返回一个元组列表,其中第 i 个元组包含每个参数序列或可迭代对象的第 i 个元素。

当参数已经在列表或元组中但需要分开作为函数调用的独立位置参数时...使用 * 运算符在函数调用中对列表或元组进行解包。

>>> data
 [[1, 2, 3], [1, 3, 4], [2, 4, 5]]

>>> zip(*data)
 [(1, 1, 2), (2, 3, 4), (3, 4, 5)]

1
>>> l =  [[1, 2, 3], [1, 3, 4], [2, 4, 5]]
>>> zip(*l)
[(1, 1, 2), (2, 3, 4), (3, 4, 5)]
>>> def average(nums, default=float('nan')):
...   return sum(nums) / float(len(nums)) if nums else default
... 
>>> [average(n) for n in zip(*l)]
[2.0, 2.6666666666666665, 3.6666666666666665]

1
我认为你在最后一行想要使用 zip(*l)。否则,你只是对每个子列表进行平均(因此你会得到2、2-2/3和3-2/3,而不是1-1/3、3和4)。 - abarnert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接