Подтвердить что ты не робот

В python, сортировка по дате поля, поле иногда может быть нулевым

Мне нелегко придумать этот способ. У меня есть данные, возвращаемые из чтения базы данных. Я хочу сортировать на accoutingdate. Однако accoutingdate иногда может быть нулевым. В настоящее время я делаю следующее:

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

Но, эта бомба с помощью "TypeError: не может сравнивать datetime.date с NoneType" из-за того, что некоторые accoutingdates являются нулевыми.

Что такое "самый правильный" или "самый Pythonic" способ справиться с этим?

4b9b3361

Ответ 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.