Pythonic способ найти, где значение находится в списке диапазонов - PullRequest
1 голос
/ 06 марта 2019

У меня есть список начальных и конечных значений:

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.Есть мысли о том, как сделать это более питоническим?

1 Ответ

2 голосов
/ 06 марта 2019

Просто проверьте каждый диапазон в отдельности. Значения между диапазонами обрабатываются автоматически, как и любые значения перед диапазоном.

def where_in_range(v, val_ranges):
    for d in val_ranges:
        if v < d['start']:
            return d['start']
        elif v < d['end']:
            return v
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...