0

有没有办法list根据“亲密关系”来获取 a 中的前一个项目?例如:

[     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包含namedtuples(称为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))
4

2 回答 2

2

根据定义,集合是无序的

集合对象是不同的可散列对象的无序集合。

您想改用列表或元组,并且可能使您的Range对象可排序(实现__cmp__方法,或使用适当的键函数;请参阅Python 排序方法)。

于 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 回答