Индекс списка вне диапазона 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 вернет кортеж элементов, объединенных из начального и конечного значения.