Python:基于贴近度从列表中获取上一个项目

时间:2012-06-28 13:03:07

标签: python

有没有办法根据'贴近度'获取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))]

以上是listnamedtuple 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))

2 个答案:

答案 0 :(得分:2)

集合为by definition not ordered

  

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

当然,这假设您的列表已经排序。