Python:按时间间隔高效查找

时间:2019-07-30 16:23:55

标签: python performance dictionary

我有一个很大的查找表,其中的键是一个间隔:

| min | max | value   |
|-----|-----|---------|
| 0   | 3   | "Hello" |
| 4   | 5   | "World" |
| 6   | 6   | "!"     |
| ... | ... | ...     |

目标是创建一个查找结构my_lookup,该结构将为每个整数返回一个值,具体取决于整数所处的范围。 例如:2 -> "Hello"3 -> "Hello"4 -> "World"

这是一个实现我想要的功能的实现:

d = {
  (0, 3): "Hello",
  (4, 5): "World",
  (6, 6): "!"
}

def my_lookup(i: int) -> str:
  for key, value in d.items():
    if key[0] <= i <= key[1]:
      return value

但是循环遍历所有条目似乎效率很低(实际查找表包含400.000行)。有没有更快的方法?

2 个答案:

答案 0 :(得分:2)

如果您的时间间隔是按升序排序的,则可以使用bisect模块(doc)。搜索是O(log n)而不是O(n):

min_lst = [0,       4,       6]
max_lst = [3,       5,       6]
values = ['Hello', 'World', '!']

import bisect

val = 2

idx = bisect.bisect_left(max_lst, val)
if idx < len(max_lst) and min_lst[idx] <= val <= max_lst[idx]:
    print('Value found ->', values[idx])
else:
    print('Value not found')

打印:

Value found -> Hello

答案 1 :(得分:0)

您的解决方案需要O(n)时间。如果表键是完全随机的,那么没有更快的方法