Конкретное решение
Реального общего решения не существует, но в вашем случае вы можете использовать следующее выражение.
ts_folder = r'\{:.1f}'.format(round(value, 1))
Общее решение
Если вам действительно нужнокакое-то обобщение, обратите внимание, что любой нелинейный паттерн вызовет проблемы.Хотя есть способ сократить код.
def classify(key, intervals):
for lo, hi, value in intervals:
if lo <= key < hi:
return value
else:
... # return a default value or None
# A list of tuples (lo, hi, key) which associates any value in the lo to hi interval to key
intervals = [
(value / 10 - 0.05, value / 10 + 0.05, r'\{:.1f}'.format(value / 10))
for value in range(-9, 10)
]
value = -0.73
ts_folder = classify(value, intervals) # r'\-0.7'
Обратите внимание, что вышеприведенное все еще не полностью безопасно от некоторой ошибки округления с плавающей точкой .Вы можете добавить точность, вручную вводя список intervals
вместо использования понимания.
Непрерывные интервалы
Если интервалы в ваших данных непрерывны, то есть между ними нет пропуска, как в вашем примере, тогда мы можем использовать некоторые оптимизации.А именно, мы можем хранить только верхнюю границу каждого интервала в списке.Затем, сохраняя их отсортированными, мы можем использовать bisect
для эффективного поиска.
import bisect
def value_from_hi(hi):
return r'\{:.1f}'.format(hi - 0.05)
def classify(key, boundaries):
i = bisect.bisect_right(boundaries, key)
if i < len(boundaries):
return value_from_hi(boundaries[i])
else:
... # return some default value
# Sorted upper bounds
boundaries = [-0.85, -0.75, -0.65, -0.55, -0.45, -0.35, -0.25, -0.15, -0.05,
0.05, 0.15, 0.25, 0.35, 0.45, 0.55, 0.65, 0.75, 0.85, 0.95]
ts_folder = classify(-0.32, boundaries) # r'\-0.3'
Важное примечание : выбор использования верхних границ и bisect_right
связано с тем, что в вашем примере исключены верхние границы.Если нижние границы были исключены, то мы должны были бы использовать те с bisect_left
.
Также обратите внимание, что вы можете обрабатывать числа вне диапазона [-0,95, 0,95 [каким-то особым образом и обратите вниманиепросто оставьте их на bisect
.