2010-12-16 16 views
0

私はtimedelta(最新の作成時間)を計算するためのレコードがたくさんあります。私は最新のものが最初に来るようにそれらを並べ替える必要があります。python sort on 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

主な質問は、「デルタ」が「なし」のレコードではどうなりますか? – khachik

+0

"None"は最後に移動する必要があります... –

答えて

2

、あなたがresにタプルを追加する前にdeltaNoneであれば、チェック - それがあれば、あなたが終わるために、空のデルタをたい場所に基づいて、既定のいくつかの並べ替え(どちらかの前にそれを設定しますまたは背中)。あなたはどれが可能なすべてのはtimedelta値も負のものよりも小さいと比較しないようにする方法について

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

私はそれを知っていますが、その "default" valは何に基づいていますか? –

+0

リストにある最高または最低のデルタ、または2001年から1967年までの何かに基づいていてもかまいません.Nothingデルタをどこで終了させるかはあなた次第です。 – girasquid

+0

@MovieYoda:それはあなたが望むwheterに基づいていますNoneの値をあなたのリストの先頭または最後に移動させようとします – nosklo

1

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

(False, None)some_timedelta(True, some_timedelta)として比較され、混合された非同等の種類のチャンスがありませんようしたがってNoneが比較されています。だから、何をやっていることは主要なフラグを使用してキーを補強です。

+0

これはtimedeltaとして 'None'のレコードを省略しますか?私はそれが... –

+1

そうだと思います。あなたはそれらを保管する必要があると述べていませんでした。 – sizzzzlerz

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

+0

+1:ニースの回答 - 自分のものより良い(&速い)。 – martineau