有没有办法根据'贴近度'获取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))]
以上是list
个namedtuple
s(称为Range
),每个都包含开始日期和结束日期。
我知道这可以使用循环等以线性方式完成,但我想知道它是否可以更有效地完成?
示例输入/输出:
如果我输入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))
答案 0 :(得分:2)
set对象是不同的可哈希对象的无序集合。
您希望使用列表或元组,并且可能使Range
个对象可排序(实现__cmp__
method,或使用适当的键功能;请参阅Python sorting HOWTO)。< / p>
答案 1 :(得分: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
当然,这假设您的列表已经排序。