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