Простейший код, помогите разобраться. 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 данное решение будет также работать для неупорядоченного списка интервалов