2 回答
TA贡献1808条经验 获得超4个赞
您可以将 dict 过滤为仅包含在sig_letters且值不等于查询值的条目。使用理解,然后使用minwith aabs作为关键函数来查找感兴趣的字典条目:
>>> 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 ...)
TA贡献1811条经验 获得超5个赞
看起来所有三个集合都已排序(在字典的情况下,'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
添加回答
举报
