我尝试获取一个列表,其中包含列表所有列表中所有(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
请帮忙!
答案 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]