В Python при сортировке по полю даты поле иногда может быть нулевым - PullRequest
22 голосов
/ 01 февраля 2010

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

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

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

Каков «самый правильный» или «самый питонский» способ справиться с этим?

Ответы [ 2 ]

29 голосов
/ 01 февраля 2010

Использование функции 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 функции, и это было бы плохим выбором для дизайна.

11 голосов
/ 01 февраля 2010

Вы можете использовать пользовательскую функцию сортировки, которая обрабатывает 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 считается меньшим, чем все объекты даты и времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...