2010-12-16 61 views
0

我有一堆記錄,我計算timedelta(最新 - 創建時間)。我需要對它們進行排序,以便最新的排在第一位。我不喜歡這樣 -python排序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 fn。正在吐出錯誤。有任何解決這個問題的方法嗎?

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

UPDATE:與None增量記錄應移動到結束。

+0

最主要的問題是:'delta'是'None'的記錄會發生什麼? – khachik 2010-12-16 17:43:43

+0

'None'應該移動到最後... – 2010-12-16 18:08:36

回答

2

在你的循環,你追加元組res之前,檢查是否deltaNone - 如果是這樣,將其設置爲某種默認的基礎上,你想空三角洲落得(無論是前或後面)。

+0

我知道,但是基於什麼是「default」val? – 2010-12-16 17:38:46

+0

你可以將它基於任何東西 - 列表中最高或最低的三角洲,或2001 - 1967年,或其他任何東西 - 這取決於你希望你的None三角洲最終落在何處。 – girasquid 2010-12-16 17:42:06

+0

@MovieYoda:它是基於你想要的無值移動到你的列表的開頭或結尾 – nosklo 2010-12-16 17:42:53

1

如何

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

這將省略與'None'記錄作爲timedelta?我認爲它會... – 2010-12-16 17:39:30

+1

當然會。你沒有說明有必要保留它們。 – sizzzzlerz 2010-12-16 17:54:12

0
def compare_time(item): 
    delta = item[2] 
    return timedelta(days=365*100) if delta is None else delta # 100 years 
3

你想沒有比所有可能timedelta值進行比較少,甚至是負的。所以,你要做的就是加強與領先的標誌你的關鍵:

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

因此None時相比(False, None)some_timedelta時相比(True, some_timedelta)而且也沒有混合非可比類型的機會。

+0

+1:很好的答案 - 比我自己更好(更快)。 – martineau 2010-12-17 20:16:07