我正在寻找一种字典的替代方法,这将允许我有效地使用范围作为键。据推测,数据结构需要排序 - 可能像b树一样?我还没有找到一个好的python实现。
例如,给定以下类字典数据结构:
d = {'38.1003827193': 'value1', '58.29932891733': 'value2'}
搜索范围38 -> 38.337
应返回value1
答案 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 = []
。