如何从Python列表计算多个平均值
这段内容是关于如何处理一组数字的。首先,给出了一串数字,这些数字是用字符串的形式表示的,并且用“end”这个词把它们分成了几组。比如,数字之间有“end”分隔符,就像把一段话分成几句。
接下来,作者想写一个函数,这个函数的作用是:给定这样一个包含数字和“end”的列表,计算每一组数字的平均值。根据上面的例子,作者希望能得到4个平均值,因为在这串数字中,有4组数字是被4个“end”分开的。
最后,作者希望有人能帮忙修正他下面的代码,因为他的代码似乎没有正常工作:
def average(bin):
total = 0.0
count=0
for number in bin:
if number==float(number):
total += float(number)
count+=1
avg = total/count
elif number=='end':
continue
return avg
4 个回答
1
你的代码之所以不工作,是因为你在每次循环时都把avg
的值覆盖掉了。你需要把每组的avg
值存储成一个列表,或者其他什么方式。每当遇到end
时,你还需要重置count
和total
。试试这个:
def average(bin):
total = 0.0
count=0
avgs = []
for number in bin:
if number == 'end':
avgs.append(avg)
total = 0.0
count = 0
else:
total += float(number)
count+=1
avg = total/count
return avgs
值得注意的是,还有更好的方法可以实现你的目标,但为了帮助你理解,我尽量对你的代码做了最少的修改。
2
这里有一种非常简洁的方法来计算这些平均值:
def average(bin):
start = 0
while 'end' in bin[start:]:
stop = bin.index('end', start)
if stop > start:
print sum(map(float, bin[start:stop])) / (stop-start)
start = stop+1
如果你想记录你的平均值,可以把它们存起来,并在函数结束时返回:
def average(bin):
results = []
start = 0
while 'end' in bin[start:]:
stop = bin.index('end', start)
if stop > start:
results.append(sum(map(float, bin[start:stop])) / (stop-start))
start = stop+1
return results
这行代码“if stop > start:”可以防止在输入中连续出现两个“结束”标记时出现除以零的错误。
如果想要更神奇的Python效果,你可以把print换成yield,这样你的函数就会变成一个生成器:
def average(bin):
start = 0
while 'end' in bin[start:]:
stop = bin.index('end', start)
if stop > start:
yield sum(map(float, bin[start:stop])) / (stop-start)
start = stop+1
for a in average(bin):
print a
4
def averages(bin):
li, s, n = [], 0, 0
for item in bin:
if item == 'end':
li.append(s / n)
s, n = 0, 0
else:
s += float(item)
n += 1
return li
averages = [sum(k) / len(k) for k in [[float(j) for j in i.split() if j] for i in ' '.join(bin).split('end') if i]]
或者,你可以试试这个一行代码: