"Paul McGuire" <[EMAIL PROTECTED]> wrote in message
news:[EMAIL PROTECTED]
> This median expression is incorrect.  median is *not* the midpoint between
> max and min values.  It is the middle value when all values are sorted
(for
> an odd number of values), or the average of the two middle values when all
> values are sorted (for an even number of values).
>
> In Python 2.4 (needed to use sorted() built-in), this can be one-lined as:
> median = lambda x: ((x % 2) and (sorted(x)[len(x)>>1]) or
> (sum(sorted(x)[(len(x)>>1):(len(x)>>1)+1])/2))
>
> (not yet tested, as I've not installed v2.4 yet)
> With boolean short-circuiting, this should only sort the list once.
>
> -- Paul
>
>
Damned off-by-one errors!

Try this instead:

median = lambda x: ((len(x) % 2) and (sorted(x)[(len(x)>>1)-1]) or
(sum(sorted(x)[((len(x)>>1)-1):(len(x)>>1)])/2))


Or using the sneaky None returned by sort(), for pre-2.4 utility:

median = lambda x: x.sort() or ((len(x) % 2) and (x[(len(x)>>1)-1]) or
(sum(x[((len(x)>>1)-1):(len(x)>>1)])/2))


-- Paul


-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to