Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:按区间高效查找_Python_Performance_Dictionary - Fatal编程技术网

Python:按区间高效查找

Python:按区间高效查找,python,performance,dictionary,Python,Performance,Dictionary,我有一个很大的查找表,其中键是一个间隔: | min | max | value | |-----|-----|---------| | 0 | 3 | "Hello" | | 4 | 5 | "World" | | 6 | 6 | "!" | | ... | ... | ... | 目标是创建一个查找结构my_lookup,根据整数所在的范围,为每个整数返回一个值。 例如:2->“你好”,3->“你好”,4->“世界” 下面是一个实现,它实现了我想

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

| min | max | value   |
|-----|-----|---------|
| 0   | 3   | "Hello" |
| 4   | 5   | "World" |
| 6   | 6   | "!"     |
| ... | ... | ...     |
目标是创建一个查找结构
my_lookup
,根据整数所在的范围,为每个整数返回一个值。 例如:
2->“你好”
3->“你好”
4->“世界”

下面是一个实现,它实现了我想要的功能:

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
d={
(0,3):“你好”,
(4,5):“世界”,
(6, 6): "!"
}
def my_lookup(i:int)->str:
对于键,d.items()中的值:

如果键[0]如果间隔已排序(按升序),则可以使用
bisect
module()。搜索是O(日志n)而不是O(n):


通常,将间隔存储在中。是否保证间隔是不相交的?是的,间隔是不相交的。在查找表初始化之后,将有数百万次的查找。。。因此,如果排序可以提高查找效率,那么它肯定是值得的。给你一些背景知识:实际的问题是根据用户在web服务器上的IP地址确定用户的国家/地区。等等,那么实际的间隔是什么:IP地址范围?那么,您可能需要Patricia trie,因为范围可能是网络前缀。
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