开发者

In python, sorting on date field, field may sometimes be null

开发者 https://www.devze.com 2022-12-18 13:16 出处:网络
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, accoutingdate may someti

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, accoutingdate may sometimes be null. I am currently doing the following:

results = sorted(results, key=operator.itemgetter('accountingdate'), reverse=True)

But, this bombs with "TypeError: can't compare datetime.date to NoneType" due to some accoutingdates being null.

What is the "most correct" or "most Pythonic" way to handle this?


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.


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.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号