Простейший код, помогите разобраться. Python

А общем, я начинающий, не могу разобраться. Есть список:

visits = [[1, 30], [41,90], [221, 280], [311, 330]]

На самом деле, значения списка совершенно не важны, нужно осуществить проверку на пересечение списков в списке visits

То что сделал я, но это очевидно не верно:

for visit in visits:
    if ((visit[0] < (visits[visits[1]]) or (visits[visits[0]])) and (visit[1] > (visits[visits[1]) or (visits[visits[0])))]:
        print('Ошибка')

Объясните пожалуйста, как реализовать такой функционал.


Ответы (3 шт):

Автор решения: user393643
visits = [[1, 30], [41,90], [221, 280], [311, 330]]
intersection = False

for i in range(1, len(visits)):
  if visits[i][0] < visits[i-1][1]:
    intersection = True

print(intersection)
→ Ссылка
Автор решения: passant

Универсальное решение, которое работает про любом порядке следования и количестве элементов в списке. Результат - все элементы списка, которые хоть как-то пересекаются.

visits = [[1, 30], [41,90], [221, 280], [30, 63], [311, 330],[41,90,55], [311, 330, 280],[41]]
vis_sets=[set(x) for x in visits]
for i,set1 in enumerate(vis_sets):
    for set2 in vis_sets[i+1:]:
        if len(set1.intersection(set2))!=0 : 
            print(list(set1),list(set2))

Результат - только пары пересекающихся списков:

[1, 30] [30, 63]
[41, 90] [41, 90, 55]
[41, 90] [41]
[280, 221] [280, 330, 311]
[330, 311] [280, 330, 311]
[41, 90, 55] [41]
→ Ссылка
Автор решения: MaxU

если вопрос о нахождении пересекающихся интервалов, то я бы решал его так:

from itertools import combinations

visits = [[41,90], [221, 280], [311, 330], [30, 50], [300, 320]]

def is_overlapping(a, b):
    return min(a[1], b[1]) - max(a[0], b[0]) >= 0

res = [[a, b] for a,b in combinations(visits, 2) if is_overlapping(a, b)]

результат:

In [30]: for x in res:
    ...:     print(x)
    ...:
[[41, 90], [30, 50]]
[[311, 330], [300, 320]]

PS данное решение будет также работать для неупорядоченного списка интервалов

→ Ссылка