В python, сортировка по дате поля, поле иногда может быть нулевым
Мне нелегко придумать этот способ. У меня есть данные, возвращаемые из чтения базы данных. Я хочу сортировать на accoutingdate. Однако accoutingdate иногда может быть нулевым. В настоящее время я делаю следующее:
results = sorted(results, key=operator.itemgetter('accountingdate'), reverse=True)
Но, эта бомба с помощью "TypeError: не может сравнивать datetime.date с NoneType" из-за того, что некоторые accoutingdates являются нулевыми.
Что такое "самый правильный" или "самый Pythonic" способ справиться с этим?
Ответы
Ответ 1
Использование функции key=
определенно правильно, вам просто нужно решить, как вы хотите обрабатывать значения None
- выберите значение datetime
, которое вы хотите рассматривать как эквивалент None
для сортировки цели. Например:.
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
, и это было бы плохой выбор дизайна для этого.
Ответ 2
Вы можете использовать специальную функцию сортировки, которая специально относится к 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
как к меньшему, чем к всем объектам datetime.