我在某种程度上被卡住了,并希望得到一些有用的指示。
我事先不知道列表的长度[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)
非常感谢任何输入,
马库斯
答案 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_longest
(izip_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()
,无论你喜欢什么),所以你不要把剩余部分放在地板上。