I won't say much besides what's here. My `return` statement is quite a headfull. """Hopefully this function will save you the trip to oocalc/excel. """ def rangeth(start, stop=None, skip=1): """rangeth([start,] stop[, skip]) returns a list of strings as places in a list (1st, 2nd, etc) >>> rangeth(4) ['0th', '1st', '2nd', '3rd'] """ if stop is None: stop, start = start, 0 places = {'1':'st', '2':'nd', '3':'rd'} return ["{}{}".format(i, places.get(i[-1], 'th')) \ if i[-2:] not in ['11', '12', '13'] else "{}{}".format(i, 'th') \ for i in map(str, range(start, stop, skip))] Also, can someone explain to me how `range` accepts it's parameters? I have my ugly little boilerplate here that I wish didn't exist. I can't find the source for range, as I gave up after thinking it's probably some header file in `include`. EDIT: I found the [source code](http://stackoverflow.com/questions/6644537/how-does-the-python-range-function-have-a-default-parameter-before-the-actual-on) for `range` in a question on SO. Thanks for the answers so far!