列表的可变列表中的平均元素
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_longest
(izip_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
,随你喜欢),这样你就不会把余数丢在地上。
我不知何故被困住了,希望得到一些有用的指导。
我事先不知道列表的长度[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_longest
(izip_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
,随你喜欢),这样你就不会把余数丢在地上。