сортировка питона по таймелте - PullRequest
0 голосов
/ 16 декабря 2010

У меня есть куча записей, для которых я рассчитываю timedelta (последний - время создания).Мне нужно отсортировать их так, чтобы последние были на первом месте.Я делаю это так -

results = list()
for i in range(100):
    res.append((name, content, delta, age))
res = sorted(res, key=lambda i:i[2], reverse=True)

Это будет прекрасно работать, но в некоторых случаях мой дельта-объект - None.так что мой lambda фн.выплевывает ошибки.Любой способ исправить это?

...
TypeError: can't compare datetime.timedelta to NoneType

ОБНОВЛЕНИЕ: записи с None дельтами должны двигаться до конца.

Ответы [ 4 ]

3 голосов
/ 17 декабря 2010

Вы хотите, чтобы Ни один не сравнивал меньше ВСЕХ возможных значений временной шкалы, даже отрицательных. Итак, что вы делаете, это увеличиваете ваш ключ ведущим флагом:

key=lambda i: (i[2] is not None, i[2])

Таким образом, None сравнивается как (False, None), а some_timedelta сравнивается как (True, some_timedelta), и нет шансов смешивания несопоставимых типов.

2 голосов
/ 16 декабря 2010

В вашем цикле, прежде чем добавить кортеж к res, проверьте, является ли delta значением None - если это так, установите для него какое-либо значение по умолчанию в зависимости от того, где вы хотите, чтобы пустые дельты заканчивались (либо спереди, либо сзади).

1 голос
/ 16 декабря 2010

Как насчет

res = sorted(filter(lambda t: t is not None, res), key=lambda i:i[2], reverse=True)
0 голосов
/ 16 декабря 2010
def compare_time( item ):
    delta = item[2]
    return timedelta(days=365*100) if delta is None else delta # 100 years
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...