Я бы решил эту проблему немного по-другому.
У вас есть много корзин (допустим, они не отсортированы).
bins = [
(0.0, 0.5),
(0.5, 1.5),
(1.5, 3.0),
(4.5, 5.5)
]
Вы получите новое значение, которое должно правильно классифицируется как специфицированный c bin.
value = (0.4, 1.0)
Обратите внимание, что я бы использовал кортеж, а не список для значения. Это больше соответствует вашему представлению бинов и гарантирует, что значение является неизменным.
Ваше решение вернет все бины, в которых это значение (хотя бы частично) содержится. Это хорошее начало!
Чтобы выбрать лучший бин, мы можем оценить ситуацию по многим различным аспектам.
Как вы написали в комментарии:
[лучший бин равен], если большинство диапазон значений пересекается с корзиной. Однако мы не знаем, что делать, если многие из наших корзин состоят из равных частей стоимости. Предполагая, что вы хотите первую ячейку из них:
def get_first_best_bin(value, bins):
best_bin = None
best_quality = 0
# Iterate on all bins, Changed name width to bin to be consistent in naming
for ind, bin in enumerate(bins):
# we need to do evaluation only if value is contained at least partly in current bin
# basically I made one-liner of your 2 ifs
if bin[0] <= value[0] <= bin[1] or bin[0] <= value[1] <= bin[1]:
# If value starts before bin we want edge of bin
# otherwise value starts somewhere in bin so we calculate from value's start
start = max(bin[0], value[0])
# If value ends in bin we want to count up to its end
# otherwise we take edge of bin
fin = min(bin[1], value[1])
# lets check if fit-quality is better now than previous best and choose current bin as best one so far
if best_quality < fin - start:
best_bin = bin
return best_bin
Если вы предпочитаете последний лучший вариант, вы должны использовать это выражение if best_quality <= fin - start
.
Аналогично вы можете выбрать best bin как bin, которая в основном заполнена значением. Просто измените выражение на if best_quality < (fin - start)/(bin[1] - bin[0])
.
Помните, что если ваше значение не содержится ни в одном из этих столбцов, результатом будет None.