繁体   English   中英

有效地找到一个值属于哪个范围

[英]Efficiently find which range a value belongs to

我有一些与值相关的日期时间范围。 我想对于其他范围,例如整数,问题也会相同。

ranges = [
    (datetime.datetime(2021, 6, 10, 10, 0), datetime.datetime(2021, 6, 10, 10, 30), 100),
    (datetime.datetime(2021, 6, 10, 10, 30), datetime.datetime(2021, 6, 10, 11, 0), 200),
    (datetime.datetime(2021, 6, 10, 11, 0), datetime.datetime(2021, 6, 10, 11, 30), 150),
    ...
]

此列表已排序,不包含任何间隙或重叠。 下限是包容性的,上限是排斥性的。

对于给定的日期时间,我想找到它所属范围的值:

def get_value_for_datetime(dt: datetime.datetime) -> int:
    ???

例如:

>>> get_value_for_datetime(datetime.datetime(2021, 6, 10, 10, 45)
>>> 200

我的第一个想法是查看bisect模块,但似乎这里没有任何东西可以帮助我处理范围,也没有办法提供自定义 function 来决定向左还是向右看,但也许我错过了一些东西.

我也不反对 numpy 和/或 pandas 解决方案,如果它明显更快,并且如果有帮助,也可以为ranges列表使用不同的结构。

您可以在下限上使用二分法,然后检查相应的上限是否满足条件upper_bound > value

import bisect

lb, ub, values = zip(*ranges)

def get_value_for_datetime(x):
    index = bisect.bisect_right(lb, x) - 1
    if index == -1 or ub[index] <= x:
        raise ValueError(x)
    return values[index]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM