用于基于范围内的键查找值的数据结构

时间:2017-06-08 14:59:52

标签: python data-structures

我正在寻找一种字典的替代方法,这将允许我有效地使用范围作为键。据推测,数据结构需要排序 - 可能像b树一样?我还没有找到一个好的python实现。

例如,给定以下类字典数据结构:

d = {'38.1003827193': 'value1', '58.29932891733': 'value2'}

搜索范围38 -> 38.337应返回value1

2 个答案:

答案 0 :(得分:0)

我不确定为什么你的密钥保存为字符串,但标准库中的bisect模块可以帮助你在排序索引中进行二进制搜索。多维索引依次是另一章,主要问题是如何使用数据;例如,对于插入或特定分布,树可能更快。

答案 1 :(得分:0)

不确定这是不是你的意思,但我认为这就是你的意思:

d = {'38.1003827193': 'value1', '58.29932891733': 'value2'}
d_keys = list(d.keys())

bound_names = ["lower bound", "upper bound"]
bounds = []
for i in range (0, 2):
    while True:
        try:
            bound = float(input("Enter the {} number: ".format(bound_names[i])))
        except ValueError:
            print("Number not entered.")
            continue
        else:
            break
    bounds.append(bound)

for n in range(len(d_keys)):
    if bounds[0] <= d_keys[n] <= bounds[1]:
        print(d[d_keys[n]])

如果输入38(下限)和38.3(上限),则打印value1

或者,您可以根据小数点前的部分搜索数字:

d = {'38.1003827193': 'value1', '58.29932891733': 'value2'}    
d_keys = list(d.keys())

bound_names = [["lower bound", "inclusive"], ["upper bound", "exclusive"]]
bounds = []
for n in range(0, 2):
    while True:
        try:
            number_to_search = int(input("Enter {} number ({}): ".format(bound_names[n][0], bound_names[n][1])))
        except ValueError:
            print("Integer not entered.")
            continue
        else:
            break
    bounds.append(number_to_search)

for n in range(len(d_keys)):
    if int(d_keys[n]) in range(bounds[0], bounds[1]):
        print(d[d_keys[n]])

当输入37(下限)和39(上限)时,代码打印:value1,但输入38时,上限value1不打印。

如果您不想打印,可以让它返回该数字的所有值的列表。 您所要做的就是将print(d[d_keys[n]])更改为numbers_in_range.append(d[d_keys[n]])并在上方添加numbers_in_range = []