我很难想出一个灵巧的方式来处理这种情况。我从数据库读回来的数据。我想对accoutingdate进行评论。但是,accoutingdate有时可能为空。我目前正在做以下事情:
results = sorted(results, key=operator.itemgetter('accountingdate'), reverse=True)
但是,由于一些accoutingdates为null,这次炸弹的“TypeError:无法将datetime.date与NoneType进行比较”。
处理此问题的“最正确”或“最恐怖”的方法是什么?
答案 0 :(得分:29)
使用key=
函数绝对是正确的,您只需要决定如何处理None
值 - 选择一个您想要视为等价的datetime
值None
用于排序目的。 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)
看看这比定义cmp
函数简单得多 - 如果你做一些基准测试,你会发现它也明显更快!使用cmp
函数代替此key
函数没有任何优势,这样做是一个糟糕的设计选择。
答案 1 :(得分:11)
您可以使用专门处理None
的自定义排序功能:
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, ...)
这会将None
视为小于所有日期时间对象。