基于timedelta的python排序

基于timedelta的python排序,python,datetime,sorting,Python,Datetime,Sorting,我有一堆记录,我为它们计算timedelta最新创建时间。我需要把它们分类,以便最新的先到。我是这样做的- results = list() for i in range(100): res.append((name, content, delta, age)) res = sorted(res, key=lambda i:i[2], reverse=True) 这将很好地工作,但在某些情况下,我的delta对象是None。所以我的lambda fn。正在吐出错误。有办法解决这个问题吗

我有一堆记录,我为它们计算timedelta最新创建时间。我需要把它们分类,以便最新的先到。我是这样做的-

results = list()
for i in range(100):
    res.append((name, content, delta, age))
res = sorted(res, key=lambda i:i[2], reverse=True)
这将很好地工作,但在某些情况下,我的delta对象是None。所以我的lambda fn。正在吐出错误。有办法解决这个问题吗

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

更新:没有增量的记录应该移到末尾。

在循环中,在将元组附加到res之前,检查增量是否为None-如果为None,则根据希望空增量在前面或后面结束的位置将其设置为某种默认值。

在循环中,在将元组附加到res之前,检查delta是否为None—如果为None,则根据您希望空delta在前面或后面结束的位置将其设置为某种默认值。

如何

res = sorted(filter(lambda t: t is not None, res), key=lambda i:i[2], reverse=True)
怎么样

res = sorted(filter(lambda t: t is not None, res), key=lambda i:i[2], reverse=True)

您不希望比较的时间差小于所有可能的时间差值,即使是负值。因此,您要做的是使用前导标志扩充密钥:

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

因此,None被比较为False,None和一些_-timedelta被比较为True,一些_-timedelta和不可比较的类型不可能被混合。

您希望None比所有可能的timedelta值都少,即使是负值。因此,您要做的是使用前导标志扩充密钥:

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

因此,None被比较为False,None和一些_-timedelta被比较为True,一些_-timedelta,不存在不可比较类型被混合的可能性。

我知道,但是默认值基于什么?你可以基于任何东西-列表中的最高或最低delta,或2001-1967,或者其他任何东西-这取决于你希望None delta结束的位置。@MovieYoda:这取决于你希望None值移动到列表的开始或结束的位置我知道,但是默认值是基于什么的?你可以基于任何东西-列表中的最高或最低delta,或者2001-1967,或者其他任何事情-这取决于您希望“无”增量结束的位置。@MovieYoda:这取决于您希望“无”值移动到列表的开头还是结尾。主要问题是:如果“无”增量为“无”,则记录会发生什么情况?应该将“无”移动到末尾……主要问题是:对于一个记录delta为None的位置?None应该移到末尾…当然会。你没有说有必要保留它们。当然会的。你没有说有必要保留它们。