如何从python列表计算多重平均值

如何从python列表计算多重平均值,python,Python,[2598.95165',2541.220308',221068.0401',end',4834.581952',1056.394859',3010.609563',2421.437603',4619.861889',746.040504',268.3881793',379.3934898',1252.527752',11459.88522',4862.167506',506.924289',634.6737389',496.4679199',17941.59143',919.4998935',

[2598.95165',2541.220308',221068.0401',end',4834.581952',1056.394859',3010.609563',2421.437603',4619.861889',746.040504',268.3881793',379.3934898',1252.527752',11459.88522',4862.167506',506.924289',634.6737389',496.4679199',17941.59143',919.4998935',727.61097',1166.055252525',34918.28358',24915',348',348',247',34918.485'', '4020.444585', '4469.896904', '2615.874982', '19862.92009', '2379.619573', '1203.268956', '4399.589212', '6838.825864', '1848.407564', '3527.198403', '33976.85042', '818.8722263', '634.6652078', '469.2685928', '4864.830004', '5103.222941', '1011.239929', '829.9915382', '8571.237936', '3301.953656', '14594.47385', '25688.83822', '4024.393045', '4163.775185、1775.894366、3682.012227、3371.092883、6651.509488、7906.092773、7297.133447、end、4566.874299、end、4255.700077、1857.648393、11289.48095、2070.981805、1817.505094、1892.256615、1757.0048、59458.46328、778.5755201、54987.32423、2245.172711、722.2663、5116.50094、1892.256615、1757.071、1793.861、1793.867.76118、14398.74281、66313.92115、11585.24151、45294.03043、6524.744077、25958.80015、593.3786209、2899.040703、85577.21342、153576.2633、5852.008444、563.0265409、70796.45356、565.2123689、6560.030116、2668.934414、418.666014、5216.392132、760.894589、8072.957671、34590571、]

我想创建一个函数,给定一个bin,它是一个列表(上面的示例),生成由字符串“end”分隔的数字的平均值。我希望上面的bin有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

您的代码不起作用,因为每次通过循环时都会覆盖
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

请注意,有更好的方法可以实现您的目标,但为了便于理解,我尝试对您的代码进行尽可能少的更改。

这里有一个非常简洁的方法来计算这些平均值:

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:”将防止出现ZeroDivision错误

对于更多Python魔法,您可以用yield替换print,您的函数将成为生成器:

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
或者,您可以尝试使用以下一行:

    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]]
这里有一个解决方案(受其他方案启发),它也给出了空集的平均值(NaN),而不是忽略它们

def average(bin):
  start=0    
  o=[]
  while 'end' in bin[start:]:
    stop = bin.index('end',start)
    s=1.0/(stop-start) if stop>start else float('nan')
    o.append(s*(sum(map(float, bin[start:stop]))))
    start=stop+1
  return o
相应的一个衬里(基于Cornett的衬里)为:


我认为您必须交换if顺序;否则float('end')将引发ValueError。number==float(number)对于字符串数字也永远不会为true。最好将
avg=total/count
移动到if块的第一行if number==float(number):在测试字符串“end”时将引发ValueError。这是获取原始数据的表单吗?可能有更简单的方法。我将在下面编辑我的答案以适应。如果将一行线延伸到几行上,我将得到+1。
def average(bin):
  start=0    
  o=[]
  while 'end' in bin[start:]:
    stop = bin.index('end',start)
    s=1.0/(stop-start) if stop>start else float('nan')
    o.append(s*(sum(map(float, bin[start:stop]))))
    start=stop+1
  return o
[sum(k) / len(k) if k else float('nan') for k in [
 [float(j) for j in i.split() if j] for i in ' '.join(bin).split('end') if i]]