import unittest ############################################################################### def getMedian(numericValues): theValues = sorted(numericValues) if not theValues: return None if len(theValues) % 2 == 1: return theValues[(len(theValues)+1)/2-1] else: lower = theValues[len(theValues)/2-1] upper = theValues[len(theValues)/2] return (float(lower + upper)) / 2 ############################################################################### if __name__ == '__main__': unittest.main() ############################################################################### class TestCommonUtils(unittest.TestCase): def test_trivial(self): return True def isValid(self, functionName, valueShouldBe, valueIs): assert (valueShouldBe == valueIs), "ERROR: Function %s returned value %.6fs, but value should be: %.6f." % (functionName, valueIs, valueShouldBe) def test_getMedian(self): self.isValid('getMedian', 2.5, getMedian([0,1,2,3,4,5])) self.isValid('getMedian', 2, getMedian([0,1,2,3,4])) self.isValid('getMedian', 2, getMedian([3,1,2])) self.isValid('getMedian', 3, getMedian([3,2,3])) self.isValid('getMedian', 1.234, getMedian([1.234, 3.678, -2.467])) self.isValid('getMedian', 1.345, getMedian([1.234, 3.678, 1.456, -2.467])) self.isValid('getMedian', 3, getMedian([3])) self.isValid('getMedian', None, getMedian([])) $ nosetests util.py .. ---------------------------------------------------------------------- Ran 2 tests in 0.001s OK
Professional programmer; amateur home handyman (on our home only); tinkerer; husband; father of 3; attempting to be a renaissance guy (to know at least a little about a lot of subjects, a doomed pursuit in an information age); geek-arts-and-sciences enthusiast. Interest areas: Science fiction, wind turbines, electric cars, renewable energy, making things.
Wednesday, July 18, 2012
Just had to create a median function in Python. We compute median values by ordering them and choosing the middle one.
I found a routine, but it lacked unittest coverage and the edge case of an empty input array. So, here goes:
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment