Сортировать список объектов Python по дате (когда некоторые из них отсутствуют) - PullRequest
8 голосов
/ 20 февраля 2011

Это небольшое обновление к моему предыдущему вопросу

У меня есть список Python, который называется results.У большинства объектов результатов в списке результатов есть объект person, а у большинства объектов person есть свойство birthdate (result.person.birthdate).Дата рождения - это объект даты и времени.

Я бы хотел упорядочить список результатов по дате рождения с самым старым первым.Однако, если нет объекта person или у объекта person нет даты рождения, я все равно хотел бы, чтобы результат был включен в список результатов.В конце списка будет идеально.

Какой самый питонский способ сделать это?

Ответы [ 5 ]

10 голосов
/ 20 февраля 2011
import datetime
results.sort(key=lambda r: r.person.birthdate
    if (r and r.person and r.person.birthdate)
    else datetime.datetime.now())

(PS Возможно, вы только что отредактировали свой предыдущий вопрос.)

3 голосов
/ 20 февраля 2011
def birthdate_key(x):
  missing = (x.person is None or x.person.birthdate is None)
  return (missing, x.person.birthdate if not missing else None)

results.sort(key=birthdate_key)
0 голосов
/ 10 марта 2015

Извлечь список, в котором элементы имеют ключи None, и добавить их в отсортированный список.

haystack = [x for x in haystack if x[date_key] is None] + sorted([x for x in haystack if x[date_key] is None], key=lambda x: x[date_key])
0 голосов
/ 12 октября 2014

Может быть, монада в Python может быть полезна здесь:

from datetime import datetime

def key(result, default=datetime.max):
    try:
         return result.person.birthday or default
    except AttributeError:
         return default

results.sort(key=key)
0 голосов
/ 20 февраля 2011

Я интерпретирую, «если нет объекта person или у объекта person нет даты рождения», чтобы означать, что у объекта результата нет атрибута «person» и аналогично объект result.person не имеет »не имеет атрибута «дата рождения».Однако я заметил, что ваш предыдущий вопрос использует странную терминологию, такую ​​как «объект person установлен на None» (в комментарии).Как вы устанавливаете объект на None?Вы имеете в виду атрибут person, установленный на None?Когда вы задаете вопрос, (1) сделайте его автономным и (2) полностью объясните, какова ваша фактическая структура данных.

import datetime
large_date = datetime.datetime(9999, 12, 31)
results.sort(key=lambda result:
    result.person.birthdate 
    if hasattr(result, 'person') and hasattr(result.person, 'birthdate')
    else large_date
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...