This seems like it should be simple, but is not returning the right answer. Why?

def median(x):
  b = sum(x)
  x = len(x)
  return b / x


You are returning an average, not a median. The median is the middle data point in a sorted sample space. The middle will be the average of two middle data points in an even length sample.


Ahh ok got - but still, my result returns 4 not 4.5 when given [4,5,5,4].

Why is that?


It has to do with the way that Python 2 works with integers and floats in division.

int / int    => int

float / int  => float

Use the float() function on your numerator.

def median(sample):
    s = sorted(sample)
    n = len(s)
    m = int(n / 2)
    return s[m] if n % 2 else float(s[m - 1] + s[m]) / 2


Can you convert an int to a float?



float(3) =>  3.0

I have an issue with converting counting numbers, though. It is a minor concern, but all the same, our code should make sense to the reader. That is why I suggested the numerator (which may be a float) as opposed to the denominator (which is a counting number).

When you see this,

(s[m - 1] + s[m]) / 2.0

the result is the same, but it is misleading the reader. Better we cast our suspicions on the variables than a literal constant.


This topic was automatically closed 7 days after the last reply. New replies are no longer allowed.