The move in recent versions of Python to passing a key function to sort() from the previous cmp function is making it trickier for me to perform complex sorts on certain objects.
For example, I want to sort a set of objects from newest to oldest, with a set of string tie-breaker fields. So I want the dates in reverse order but the strings in their natural order. With a comparison function I can just reverse the comparison for the date field compared to the string fields. But with a key function I need to find some way to invert/reverse either the dates or the strings.
It’s easy (although ugly) to do with numbers – just subtract them from something – but do I have to find a similar hack for dates (subtract them from another date and compare the timedeltas?) and strings (…I have no idea how I’d reverse their order in a locale-independent way).
I know of the existence of functools.cmp_to_key() but it is described as being “primarily used as a transition tool for programs being converted to Python 3 where comparison functions are no longer supported”. This implies that I should be able to do what I want with the key method – but how?
The slow-but-elegant way to do this is to create a value wrapper that has reversed ordering:
If you don’t have
functools.total_ordering, you’d have to implement all 6 comparisons, e.g.: