不平等列表的平均值

时间:2017-02-12 16:53:30

标签: python list mean

我尝试获取一个列表,其中包含列表所有列表中所有(i)元素的平均值。如果我有下一个列表,请解释更多:

A=[[1,2],  [2,3], [1,2,3], [3,4,5], [2,2,1]].

我希望[a,b,c]使用:

a = (1+2+1+3+2)/5
b = (2+3+2+4+2)/5
c = (3+5+1)/3

请帮忙!

3 个答案:

答案 0 :(得分:2)

使用itertools.zip_longest将值压缩在一起。额外的困难是数据的长度不同。 zip_longest插入None作为填充值。我们必须创建一个筛选列表,并仅计算这些项:

import itertools

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

tuples = itertools.zip_longest(*A)
for t in tuples:
    s = [x for x in t if x is not None]
    print(sum(s)/len(s))

结果:

1.8
2.6
3.0

编辑:单行(可能有点复杂,使用lambda计算均值):

result = [(lambda x : sum(x)/len(x))([x for x in t if x is not None]) for t in itertools.zip_longest(*A)]

结果:[1.8, 2.6, 3.0]

(Python 2用户必须将zip_longest替换为izip_longest

答案 1 :(得分:1)

如果您使用的是Python2,可以尝试使用itertools.izip_longest()

from itertools import izip_longest
from __future__ import division

A=[[1,2],  [2,3], [1,2,3], [3,4,5], [2,2,1]]
a,b,c = [sum(filter(None, c))/len(filter(None,c)) for c in izip_longest(*A)]

print a
print b
print c

输出:

1.8
2.6
3.0

答案 2 :(得分:1)

使用itertools.zip_longest生成子列表,使用statistics.mean计算每个组的平均值,忽略None s:

from itertools import zip_longest
from statistics import mean

averages = list(map(lambda l: mean(i for i in l if i != None), zip_longest(*A)))

用你的例子:

>>> A = [[1, 2], [2, 3], [1, 2, 3], [3, 4, 5], [2, 2, 1]]
>>> from itertools import zip_longest
>>> from statistics import mean
>>> list(map(lambda l: mean(i for i in l if i != None), zip_longest(*A)))
[1.8, 2.6, 3]