0

list'近さ'に基づいて、前のアイテムを取得する方法はありますか?例えば:

[     Range(start=datetime.datetime(2012, 1, 1, 0, 0, 0), end=datetime.datetime(2012, 1, 15, 0, 0, 0)),
      Range(start=datetime.datetime(2012, 2, 1, 0, 0, 0), end=datetime.datetime(2012, 2, 15, 0, 0, 0)),
      Range(start=datetime.datetime(2012, 3, 1, 0, 0, 0), end=datetime.datetime(2012, 3, 15, 0, 0, 0))]

上記はs(と呼ばれる)をlist含み、それぞれに開始日と終了日が含まれています。namedtupleRange

ループなどを使って直線的にできることは知っていますが、もっと効率的にできるのではないかと思いました。

入出力例

を入力するdatetime.datetime(2012, 1, 3, 0, 0, 0)と、最も近い前の開始日時が返されます。

Range(start=datetime.datetime(2012, 1, 1, 0, 0, 0), end=datetime.datetime(2012, 1, 15, 0, 0, 0))

を入力datetime.datetime(2012, 1, 27, 0, 0, 0)すると、上記と同じように返されます。

Range(start=datetime.datetime(2012, 1, 1, 0, 0, 0), end=datetime.datetime(2012, 1, 15, 0, 0, 0))

入力するdatetime.datetime(2012, 2, 14, 0, 0, 0)と、次のようになります。

Range(start=datetime.datetime(2012, 2, 1, 0, 0, 0), end=datetime.datetime(2012, 2, 15, 0, 0, 0))
4

2 に答える 2

2

セットは定義上、順序付けされていません:

セット オブジェクトは、個別のハッシュ可能なオブジェクトの順序付けられていないコレクションです。

代わりにリストまたはタプルを使用し、おそらくオブジェクトをソート可能にします(メソッドRangeを実装するか、適切なキー関数を使用します。Python ソート HOWTOを参照してください)。__cmp__

于 2012-06-28T13:04:54.673 に答える
2

__lt__オブジェクトに対してまたは__cmp__を実装する場合はRange、次のことができます。

import bisect
position = bisect.bisect_left(range_list, your_input)
if position > 0:    
    nearest_range = range_list[position - 1]
else:
    nearest_range = None

もちろん、これはリストがすでにソートされていることを前提としています。

于 2012-06-28T13:12:15.400 に答える