Нужно сделать перебор словаря по приблизительным значениям
Есть словарь, ключи например 0.2311 и 0.2317 нужно сделать так что б при обращении к словарю по ключу 0.2316 выводилось значение по ключу 0.2317, так как оно ближе всего, или наоборот если по ключу 0.2312 выводилось значение по ключу 0.2311
k_1_33 = {
1.00:0.00000,
1.01:0.00247,
1.02:0.00490,
1.03:0.00731,
1.04:0.00968,
1.05:0.01203,
1.06:0.01435,
1.07:0.01665,
1.08:0.01891,
1.09:0.02116,
1.10:0.02337,
1.11:0.02556,
1.12:0.02773,
1.13:0.02987,
1.14:0.03199,
1.15:0.03408,
1.16:0.03616,
1.17:0.03821,
1.18:0.04024,
1.19:0.04224,}
reversed_dict = {v: k for k, v in k_1_33.items()}
one_one_etvd = L_tvd/(C_p_gv*T_j_7_8*kpd_tvd)
okr_one_one_etvd = round(one_one_etvd, 4)
pi_tvd = reversed_dict[okr_one_one_etvd]
# okr_one_one_etvd = 0.2133 но если оно будет 0.2134 то такого ключа уже нет
print(pi_tvd)
Ответы (2 шт):
Как я заметил словарь у вас отсортирован, так что вот простое решение:
Ищем номер элемента, у которого значение больше нашего, и потом смотрим, какое значение ближе
# С list легче работать
k_1_33_list = list(k_1_33.items())
def getKey(find_value):
for i, key_val in enumerate(k_1_33_list):
key = key_val[0]
val = key_val[1]
if find_value < val:
prev = k_1_33_list[i-1]
dist_for_val = val - find_value
dist_for_next = find_value - prev[1]
return key if dist_for_val < dist_for_next else prev[0]
Если же вам не нужен ключ, а только значение, то всё становится проще:
k_1_33_values = list(k_1_33.values())
def getValue(find_value):
for i, val in enumerate(k_1_33_values):
if find_value < val:
prev = k_1_33_values[i-1]
dist_for_val = val - find_value
dist_for_next = find_value - prev
return val if dist_for_val < dist_for_next else prev
Складываете пары ключ-значение в список
Сортируете его (если изначально не отсортировано)
Находите бинарным поиском из bisect индекс места k, куда можно вставить искомое значение (это даст логарифмическое время поиска, очень быстро)
Проверяете расстояния от искомого значения до ключей k-го и (k-1)-го, смотрите, какой ближе
Используете второй элемент соответствующей пары.