我是来自excel的Python的新手。我想要一个列表的平均值,但是每个新项目。列表:
x = [-3.2, 2.7, -8.5, -1.4]
我试过了:
avg = sum(col)/len(col)
这给出了-2.6的结果,这是整个列除以整数。我希望它能在每次迭代时返回平均值。我试过使用for循环:
def avg2(x):
ttl = 0
for i in x:
ttl += i
res = ttl / len(x)
return res
相同的结果,整数和整列。它遍历整个列表,而不是每个值的总计。作为参考,excel公式将是(对于A列中的数字):
=AVERAGE(A$1:A4)
将公式向下拖动到A5时,结果将用于该次迭代的所有内容。
也许在循环中使用枚举或循环?
答案 0 :(得分:2)
你的平均功能:
def avg(lst): return sum(lst)/len(lst)
基本上,您希望将avg()
应用于x
的切片。为了清楚起见,x
的切片是:
>>> x[:1]
[-3.2]
>>> x[:2]
[-3.2, 2.7]
>>> x[:3]
[-3.2, 2.7, -8.5]
使用列表推导将其应用于x
的切片:
>>> [avg(x[:i]) for i in range(1,len(x)+1)]
[-3.2, -0.25, -3.0, -2.6]
答案 1 :(得分:0)
您在循环过程中未将结果保存在任何位置。你只是在最后归还它,这就是你获得这些结果的原因:
def avg2(x):
res = []
total = 0
for i in x:
total += i
res.append(total / len(x))
return res
将导致:
>>> x = [-3.2, 2.7, -8.5, -1.4]
>>> avg2(x)
[-0.8, -0.125, -2.25, -2.6]
请注意,这会在整个列表的长度上平均total
,而不是到目前为止已经平均的值的数量。例如,当它-0.125
平均时,它-0.925 / 4
而不是-0.925/ 2
。要实现这一点,您可以使用enumerate
及其可选的start
参数来避免除以0:
def avg2(x):
res = []
total = 0
for idx, i in enumerate(x, 1):
total += i
res.append(total / idx)
return res