Это будет работать без смешения минимальных / максимальных значений различных индексов (например, 33000):
minsalary = [22000,41000,10000,51500,13000]
maxsalary = [35000,95000,34000,65000,31000]
salary = 14000
index = min((b-a,i) for i,(a,b) in enumerate(zip(minsalary,maxsalary)) if salary in range(a,b+1))[1]
print(f'Best range is {minsalary[index]} to {maxsalary[index]}, use position {index}')
Вот разбитая версия, чтобы лучше изолировать каждый шаг:
ranges = zip(minsalary,maxsalary) # [ (min,max), (min,max), ... ]
indexedRanges = enumerate(ranges) # [ (0,(min,max)), (1,(min,max)) ... ]
eligibleIndexes = [ (b-a,i) for i,(a,b) in indexedRanges if salary>=a and salary <= b ] # [ (size,2), (size,4) ]
smallest = min(eligibleIndexes) # (size,4)
index = smallest[1]
print(f'Best range is {minsalary[index]} to {maxsalary[index]}, use position {index}')
- Переменная
ranges
преобразует два массива в массив кортежей с (минимальным, максимальным) окладами в диапазонах.
- Переменная
indexedRanges
добавляет индекс (позицию) к кортежам диапазонов
-
eligibleIndexes
фильтрует indexedRanges
, чтобы сохранить только те элементы, где заработная плата находится внутри диапазона, и возвращает размер диапазона и соответствующий индекс
- Переменная
smallest
получает минимальную запись eligibleIndexes
, которая имеет наименьший размер диапазона. В результате получается кортеж с размером и индексом.
-
index
наилучшего допустимого диапазона - это вторая часть smallest
кортежа.