I am having a hard time coming up with a slick way to handle this sort. I have data coming back from a database read. I want to sort on the accoutingdate. However, accoutingd
You could use a custom sorting function that treats None
specially:
def nonecmp(a, b):
if a is None and b is None:
return 0
if a is None:
return -1
if b is None:
return 1
return cmp(a, b)
results = sorted(results, cmp=nonecmp, ...)
This treats None
as being smaller than all datetime objects.
Using a key=
function is definitely right, you just have to decide how you want to treat the None
values -- pick a datetime
value that you want to treat as the equivalent of None
for sorting purposes. E.g.:
import datetime
mindate = datetime.date(datetime.MINYEAR, 1, 1)
def getaccountingdate(x):
return x['accountingdate'] or mindate
results = sorted(results, key=getaccountingdate, reverse=True)
Just see how much simpler this is than defining a cmp
function instead -- and if you do some benchmarking you'll find it's also significantly faster! There's no upside at all in using a cmp
function instead of this key
function, and it would be a bad design choice to do so.