Индекс списка вне диапазона Django перекрытие

Привет, когда я проверяю overalapping, я получаю индекс списка вне диапазона, как я могу это решить,

 for i in range(count):
        start_value=(self.data.get(f'applicationvalue_set-{i}-start_value', []))
        end_value=(self.data.get(f'applicationvalue_set-{i}-end_value', []))
        if start_value is not None or end_value is not None:
            value1=[]
            value2=[]
            for start in start_value:
                if start not in value1:
                    value1.append(start)
            for end in end_value:
                if end not in value2:
                    value2.append(end)
            a=range(value1[0],value1[-1])

            b=range(value2[0],value2[-1])
            if a in b.exists():
                 raise ValidationError("overlap not allowed")djangp

Я не вижу смысла в стольких строках кода, когда это можно просто решить с помощью set():

 start_value=set(self.data.get(f'applicationvalue_set-{i}-start_value', []))
 end_value= set(self.data.get(f'applicationvalue_set-{i}-end_value', []))
 
 if end_value.intersection(start_value):
     raise ValidationError("overlap not allowed")

Здесь я преобразовываю список в набор, так как тип данных набора содержит только уникальные данные, и я могу выполнить пересечение между двумя наборами. Более подробную информацию можно найти здесь: https://docs.python.org/3/tutorial/datastructures.html#sets

Альтернатива

Вы можете считать, что минимум значения end_value больше, чем максимум значения start_value:

if min(end_value) < max(start_value):
    raise ValidationError("overlap not allowed")

Альтернатива 2

Я не уверен, что вам следует использовать set, это может испортить последовательность ввода от пользователя (так как set удаляет любые дубликаты). Если это не проблема, то вы можете использовать следующий код:

prev = None

for x in zip(start_value, end_value):
    if prev and x[0] < prev[1]:
        raise ValidationError("...")
    prev = x

Здесь zip вернет кортеж элементов, объединенных из начального и конечного значения.

Вернуться на верх