Doctest
Contents
1. Writing a doctest
1 def get_percentile(number_list, percentile=50):
2 """
3 Return percentile of the given list of numbers
4
5 Return median if percentile not given.
6
7 >>> get_percentile([9, 3, 44, 17, 15])
8 15
9
10 >>> get_percentile([8, 3, 44, 17, 12, 6])
11 10
12
13 >>> get_percentile([77,29,33,93,17,13,25])
14 29
15
16 >>> get_percentile([72,38,39,72,42,80,35])
17 42
18
19 Because of the way floats are stored in memory, never compare
20 floats directly in doctest.
21 >>> abs( get_percentile([91,5,31,84,37,45,25], 95) - 88.9)
22 0.0
23
24 """
25 number_list.sort()
26 # http://en.wikipedia.org/wiki/Percentile#Alternative_methods
27 N = len(number_list)
28 index = ((N-1) * percentile)/100.0
29 if (index == 0) or (index == N):
30 return number_list[N]
31 else:
32 whole,decimal = int(index), index % 1
33 value = ( number_list[whole] +
34 decimal * ( number_list[whole + 1] - number_list[whole]))
35
36 # If integer return an int or else return the float
37 return int(value) if not (value % 1) else value
38
2. Running the test
No output in normal case.
$ python -m doctest get_median.py $
For verbosity, use the "-v" parameter.
$ python -m doctest -v get_median.py
Trying:
get_percentile([9, 3, 44, 17, 15])
Expecting:
15
ok
Trying:
get_percentile([8, 3, 44, 17, 12, 6])
Expecting:
10
ok
Trying:
get_percentile([77,29,33,93,17,13,25])
Expecting:
29
ok
Trying:
get_percentile([72,38,39,72,42,80,35])
Expecting:
42
ok
Trying:
abs( get_percentile([91,5,31,84,37,45,25], 95) - 88.9)
Expecting:
0.0
ok
1 items had no tests:
get_median
1 items passed all tests:
5 tests in get_median.get_percentile
5 tests in 2 items.
5 passed and 0 failed.
Test passed.
