Нужно сделать перебор словаря по приблизительным значениям

Есть словарь, ключи например 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
→ Ссылка
Автор решения: MBo

Складываете пары ключ-значение в список

Сортируете его (если изначально не отсортировано)

Находите бинарным поиском из bisect индекс места k, куда можно вставить искомое значение (это даст логарифмическое время поиска, очень быстро)

Проверяете расстояния от искомого значения до ключей k-го и (k-1)-го, смотрите, какой ближе

Используете второй элемент соответствующей пары.

→ Ссылка