У меня есть список начальных и конечных значений:
a = [
{'start': 1, 'end': 3},
{'start': 5, 'end': 6},
{'start': 8, 'end': 10}
]
Список гарантированно будет в порядке и не будет перекрываться.Учитывая значение, мне нужно найти, где в списке оно падает.Если он находится в одном из определенных диапазонов, мне нужно вернуть значение.В противном случае мне нужно следующее «начальное» значение в последовательности.например, учитывая b = 2
, я бы вернул значение 2
, потому что оно находится в первом диапазоне.Однако, учитывая значение b = 7
, я получу обратно 8
, поскольку это начальное значение для следующего диапазона в последовательности от 7.
Я написал некоторый код для этого:
def where_in_range(v, val_ranges):
# Check if v comes before all ranges
if v < val_ranges[0]['start']:
return val_ranges[0]['start']
# Check if v is within one of the ranges
for r in val_ranges:
if v >= r['start'] and v <= r['end']:
return v
# Check if v is between ranges
for i in range(0, len(val_ranges)-1):
if v > val_ranges[i]['end'] and v < val_ranges[i+1]['start']:
return val_ranges[i+1]['start']
return None
Но, похоже, это совершенно непитонно.Я готов использовать легкий пакет, но что-то тяжелее, чем pandas, отсутствует, так как оно встроено в приложение django.Есть мысли о том, как сделать это более питоническим?