如何从Python列表计算多个平均值

0 投票
4 回答
1316 浏览
提问于 2025-04-17 10:39

这段内容是关于如何处理一组数字的。首先,给出了一串数字,这些数字是用字符串的形式表示的,并且用“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时,你还需要重置counttotal。试试这个:

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]]

或者,你可以试试这个一行代码:

撰写回答