具有有序键和键值区间选择的字典类数据结构

dictionary like data structure with ordered keys and selection between interval of key values

假设我想存储有序值,其中键值表示下限。像这个例子:

d = {1: "pear", 4: "banana", 7: "orange"}

我可以通过d[1]访问第一个对象。假设我想存储它,以便我可以通过调用 [1,4) 之间的任何值来访问第一个对象 "pear"。如果我在 [4,7) 之间输入任何 "keyvalue",我希望返回 "banana"。 python中有没有类似的数据结构?我找到了 intervalTrees,但它看起来比我要找的要高级一些。在 intervalTrees 中,作为键的间隔可以重叠,我不希望这样。或者它可能不是我想要的任何类型的字典,因为您可以将数据类型混合为一个字典中的键。你怎么看?

编辑:根据我得到的提示,这将是一个有效的代码:

import bisect

d = [(1, "pear"), (4, "banana"), (7,"orange") ]
keys = [j[0] for j in d]

for v in range(1,10):
    print("Using input ", v)
    i = bisect.bisect(keys, v) - 1
    out = d[i]
    print(out)
    print("")

# Or using SortedDict
from sortedcontainers import SortedDict

d2 = SortedDict()
d2[1] = 'pear'
d2[4] = 'banana'
d2[7] = 'orange'

for v in range(1,10):
    print("Using input ", v)
    i = bisect.bisect(d2.keys(), v) - 1
    j = d2.keys()[i]
    out = d2[j]
    print(out)
    print("")

您要查找的数据结构是二叉搜索树 (BST),最好是 balanced BST。您的字典键是 BST 的键,每个节点只会有一个额外的字段来存储相应的值。那么您的查找只是键的下限/左平分。查找 Python 红黑树或 AVL 树的实现 returns 许多可能的包。

没有用于始终排序数据的内置库。如果您永远不需要添加或删除键,则可以在排序列表中使用 bisect 和 (key, value) 元组。

对于允许修改的纯 Python 实现,我建议从内存中的 the SortedContainers library. It's built to be a drop-in replacement for BST's, is very usable and tested, and claims to outperform 基于指针的 BST 检查 SortedDict,并在合理大小的数据集上速度(但没有相同的渐近线)作为 BST 的保证)。您还可以提供自定义键来比较不同类型的对象。