如何在排序列表中查找条件最接近值



>想象一下我们有以下代码:

val_list = [1000,2000,2500,3200,4000,4200,4800,4900,5000,5001,5002,5003]
val_dict = {"a":1000,"b":2000,"c":2500,"d":3200,"e":4000,"f":4200,"g":4800,"h":4900,"i":5000,"j":5001,"k":5002,"l":5003}
sig_letters = ["a","b","d","f","h","i","k","l"]

本质上,我们有一些值的排序列表。这些值也是另一个字典的值。

然后,关联的键可能(也可能不(在另一个列表中。

假设我对val_list中的数字"5000"感兴趣,并且我想找到最近的有效字母,不包括它自己。

我不知道如何实现查找最近的有效字母。因为在这种情况下,最近的有效字母实际上是"k": 5002距离"i":50002 个索引位置。

"h":4900不是一个可接受的答案,因为 |4900-5000| = 100 和 |5002-5000| = 2 之间的绝对差异。

在程序测试 4900 更接近之前,我不知道如何让一些东西来测试 5002 是否接近 5000。由于 5002 和 4900 的键都在sig_letters,它应该首先测试 5002 以打破循环。

可以将字典筛选为仅sig_letters中的条目和不等于查询值的值。使用理解,然后使用带有absmin作为关键函数来查找感兴趣的字典条目:

>>> x=5000
>>> min({k:v for k,v in val_dict.items() if k in sig_letters and v!=x}.items(), key=lambda e: abs(x-e[1]))
('k', 5002)

在Python 3.x中,.items()是一个动态字典视图对象。它快速且随着基础字典的变化而更新。

如果您使用的是 Python 2.7,请使用 .viewitems(( 而不是 items(((并考虑更新到 Python 3.x...(

看起来所有三个集合都已排序(在字典的情况下,"a"的值总是小于"b",依此类推(。这使得事情变得非常简单 - 查看字母的两面sig_letters


def absolute_difference(a: int, b: int) -> int:
return a - b if a > b else b - a
def nearest(val: int) -> str:
global val_list, val_dict, sig_letters
exact_key = None
# Find the corresponding key in val_dict (catch not found)
for key, value in val_dict.items():
if value == val:
exact_key = key
# Find exact_key's index in sig_letters  (catch ValueError)
exact_index = sig_letters.index(exact_key)
# Get values to left and right (catch out of bounds)
left = sig_letters[exact_index-1]
right = sig_letters[exact_index+1]
left_val = val_dict[left]
right_val = val_dict[right]

if absolute_difference(left_val, val) < absolute_difference(right_val, value):
return left
else: 
return right

最新更新