平均列表python

时间:2012-06-06 18:04:43

标签: python

我有一份清单清单: 类似的东西:

data = [[240, 240, 239],
        [250, 249, 237], 
        [242, 239, 237],
        [240, 234, 233]]

我希望像

一样平均
[average_column_1, average_column_2, average_column_3]

我的代码就像不太优雅。 这是通过列表的天真方式,将总和保持在单独的容器中,然后除以元素的数量。

我认为有一种pythonic方法可以做到这一点。 有什么建议? 感谢

5 个答案:

答案 0 :(得分:53)

Pure Python:

from __future__ import division
def mean(a):
    return sum(a) / len(a)
a = [[240, 240, 239],
     [250, 249, 237], 
     [242, 239, 237],
     [240, 234, 233]]
print map(mean, zip(*a))

印刷

[243.0, 240.5, 236.5]

NumPy的:

a = numpy.array([[240, 240, 239],
                 [250, 249, 237], 
                 [242, 239, 237],
                 [240, 234, 233]])
print numpy.mean(a, axis=0)

Python 3:

from statistics import mean
a = [[240, 240, 239],
     [250, 249, 237], 
     [242, 239, 237],
     [240, 234, 233]]
print(*map(mean, zip(*a)))

答案 1 :(得分:23)

data = [[240, 240, 239],
        [250, 249, 237], 
        [242, 239, 237],
        [240, 234, 233]]
avg = [float(sum(col))/len(col) for col in zip(*data)]
# [243.0, 240.5, 236.5]

这是有效的,因为zip(*data)将为您提供一个列有分组列的列表,float()调用仅在Python 2.x上调用,它使用整数除法,除非使用from __future__ import division

答案 2 :(得分:14)

使用zip(),如下所示:

averages = [sum(col) / float(len(col)) for col in zip(*data)]

zip()接受多个可迭代的参数,并返回那些迭代的切片(作为元组),直到其中一个迭代不能再返回任何东西。实际上,它执行转置操作,类似于矩阵。

>>> data = [[240, 240, 239],
...         [250, 249, 237], 
...         [242, 239, 237],
...         [240, 234, 233]]

>>> [list(col) for col in zip(*data)]
[[240, 250, 242, 240],
 [240, 249, 239, 234],
 [239, 237, 237, 233]]

通过对每个切片执行sum(),您可以有效地获得按列的总和。只需除以列的长度即可得到均值。

侧点:在Python 2.x中,默认情况下整数除以十进制,这就是调用float()将结果“提升”为浮点类型的原因。

答案 3 :(得分:6)

import numpy as np

data = [[240, 240, 239],
        [250, 249, 237], 
        [242, 239, 237],
        [240, 234, 233]]

np.mean(data, axis=0)
# array([ 243. ,  240.5,  236.5])

似乎工作。

答案 4 :(得分:0)

您可以使用mapzip

list(map(lambda x: sum(x)/len(x), zip(*data)))
[243.0, 240.5, 236.5]