列表的可变列表中的平均元素

average elements in a variable list of lists

我不知何故被困住了,希望得到一些有用的指导。

我事先不知道列表的长度[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)

非常感谢任何输入,

马库斯

假设所有子列表的长度相同,您可以使用 zip 轻松做到这一点:

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

zip(*ally) 有效地将 [[a1, a2, ...], [b1, b2, ...]] 转换为 (a1, b1)(a2, b2) 等的 tuple,因此 Python 完成了为您匹配每个子列表中的值。

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

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) 将使用 t运行cating 除法 int/long;如果您想要真正的除法,请将 from __future__ import division 添加到文件的顶部(或在您的解释器中添加 运行 )以默认获得 Py3 真正的除法(使用 // 进行地板除法),或将 len(suby) 包装在 float() 构造函数中(或将其乘以 1.0,随你喜欢),这样你就不会把余数丢在地上。