can some one help me with my code. thanks

Jon Clements joncle at googlemail.com
Fri Jan 20 20:30:49 EST 2012


On Jan 20, 9:26 pm, Terry Reedy <tjre... at udel.edu> wrote:
> On 1/20/2012 2:46 PM, Terry Reedy wrote:
>
>
>
>
>
>
>
>
>
> > On 1/20/2012 1:49 PM, Tamanna Sultana wrote:
>
> >> can some one help me??
> >>> I would like to create a function that, given a bin, which is a list
> >>> (example below), generates averages for the numbers separated by a
> >>> string 'end'. I am expecting to have 4 averages from the above bin,
> >>> since there are 4 sets of numbers separated by 4 'end' strings
>
> > [Posting your overly long set of data lines with a '>' quote at the
> > beginning of each line was a nuisance. Reposted with few lines. I will
> > let you compare your code to mine.]
>
> > bin = ['2598.95165', '2541.220308', '221068.0401', 'end', '4834.581952',
> > '1056.394859', '3010.609563', '2421.437603', '4619.861889',
> > '3682.012227', '3371.092883', '6651.509488', '7906.092773',
> > '7297.133447', 'end', '4566.874299', 'end', '4255.700077',
> > '1857.648393', '11289.48095', '2070.981805', '1817.505094',
> > '563.0265409', '70796.45356', '565.2123689', '6560.030116',
> > '2668.934414', '418.666014', '5216.392132', '760.894589', '8072.957639',
> > '346.5905371', 'end']
>
> > def average(bin):
> > num=[]
> > total = 0.0
> > count=0
> > for number in bin:
> > if number!='end':
> > total += float(number)
> > count+=1
> > else:
> > num.append(total/count)
> > total = 0.0
> > count= 0
> > return num
>
> > print(average(bin))
>
> > [75402.73735266666, 4485.0726684, 4566.874299, 7817.36494866]
>
> U're welcome. But do notice Tim's comment. In non-toy situations, you
> have to decide how to handle empty collections (return float('nan')?),
> or whether to just let whatever happens happen.
>
> If you control the input format, a list of lists would be easier than an
> end marker. But sometimes one is handed data and asked to process it as is.
>
> Also note (this is a more advanced topic) that average() could be turned
> into a generator function by replacing 'num.append(total/count)' with
> 'yield total/count' and removing the initialization and return of num.
>
> --
> Terry Jan Reedy

Not directing this at you Terry, and you and Tim have made fine points
-- this just appears to me to be the best point at which to respond to
a thread.

To the OP - you have great answers, and, please note this just happens
to be the way I would do this.

I would separate the parsing of the data, and the calculation code
out. I've whipped this up rather quickly, so it might have a few flaws
but...

from itertools import groupby
def partition(iterable, sep=lambda L: L == 'end', factory=float):
    for key, vals in groupby(iterable, sep):
        if not key: yield map(factory, vals)

# And a pure cheat, but useful if more complex calculations are
required etc... (Plus covers NaN)
import numpy as np
print map(np.mean, partition(bin))

What you've got will work though, so wouldn't worry too much and this
is just my 2p,

Jon.



More information about the Python-list mailing list