变量列表中的平均元素

时间:2015-12-21 17:54:07

标签: python list iteration

我在某种程度上被卡住了,并希望得到一些有用的指示。

我事先不知道列表的长度[X];即子列表的数量[y1,y2,y3,...,yn]。

如何根据位置处理每个子列表中的每个元素?

即,

Z1 = avg(y1 [1] + y2 [1] +,....,+ y [1] n)

Z2 = avg(y1 [2] + y2 [2] +,....,+ y [2] n)

Z3 = avg(y1 [3] + y2 [3] +,....,+ y [3] n)

Zm = avg(y1 [m] + y2 [m] +,....,+ y [m] n)

非常感谢任何输入,

马库斯

1 个答案:

答案 0 :(得分:0)

假设所有子列表都具有相同的长度,您可以使用zip轻松完成此操作:

ally = [...]
averages = [sum(suby) / len(suby) for suby in zip(*ally)]

zip(*ally)有效地将[[a1, a2, ...], [b1, b2, ...]]转换为tuple(a1, b1)(a2, b2),因此Python可以完成匹配每个值的工作你的子名单。

如果要处理子列表长度不匹配的情况(例如[[a1, a2], [b1, b2, b3]]),则会更复杂;您需要在Python 2上使用itertools.zip_longestizip_longest)并过滤掉垃圾条目以避免将它们包含在平均值中:

from itertools import zip_longest

# zip_longest matches up values until last value exhausted
# with shorter sequences substituting in None
# We then use the generator expression to remove the Nones
stripped = ([y for y in suby if y is not None] for suby in zip_longest(*ally))
# Then average as normal
averages = [sum(suby) / len(suby) for suby in stripped]

如果你想将太短的子list视为0(因此它们会降低平均值),那就更简单了:

averages = [sum(suby) / len(suby) for suby in zip_longest(*ally, fillvalue=0)]

其中fillvalue可以根据需要更改为其他默认值。

注意:如果这是Python 2代码,sum(suby) / len(suby)将使用截断分部,如果所有值均为int / long;如果你想要真正的除法,可以将from __future__ import division添加到文件的顶部(或在解释器中运行)以默认获得Py3 true division(使用//进行分区),或者包裹{在len(suby)构造函数中{1}}(或者将其乘以float(),无论你喜欢什么),所以你不要把剩余部分放在地板上。