2 回答

TA貢獻1808條經驗 獲得超4個贊
您可以將 dict 過濾為僅包含在sig_letters
且值不等于查詢值的條目。使用理解,然后使用min
with 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
添加回答
舉報