Per prima cosa ordiniamo l'elenco per ora di inizio.
Quindi eseguiamo un ciclo su di esso controllando se la prossima ora di inizio è inferiore all'ora di fine precedente.
Questo controllerà se x + 1 si sovrappone con x (non se x + 2 si sovrappone con x, ecc)
intervals = [[100,200],[150,250],[300,400]]
intervalsSorted = sorted(intervals, key=lambda x: x[0]) # sort by start time
for x in range(1,len(intervalsSorted)):
if intervalsSorted[x-1][1] > intervalsSorted[x][0]:
print "{0} overlaps with {1}".format(intervals[x-1], intervals[x])
# result: [100, 200] overlaps with [150, 250]
Il seguente dovrebbe darvi tutte le sovrapposizioni in tutta la lista.
intervals = [[100,200],[150,250],[300,400],[250,500]]
overlapping = [ [x,y] for x in intervals for y in intervals if x is not y and x[1]>y[0] and x[0]<y[0] ]
for x in overlapping:
print '{0} overlaps with {1}'.format(x[0],x[1])
# results:
# [100, 200] overlaps with [150, 250]
# [250, 500] overlaps with [300, 400]
Si noti che questa è una ricerca O (n * n). (chiunque mi corregga qui se ho torto!)
Questo è probabilmente più lento del primo (non lo test, ma presumo che lo sia) perché questo itera su tutta la lista per ogni singolo indice. Dovrebbe essere simile all'esempio nested for loop di arbarnert. Ma poi di nuovo questo ti dà tutti i valori sovrapposti rispetto al primo metodo che ho mostrato che controllava solo i tempi di sovrapposizione tra quelli adiacenti (ordinati per ora di inizio).
test esteso dà:
intervals = [[100,200],[150,250],[300,400],[250,500],[10,900],[1000,12300],[-151,32131],["a","c"],["b","d"],["foo","kung"]]
overlapping = [ [x,y] for x in intervals for y in intervals if x is not y and x[1]>y[0] and x[0]<y[0] ]
for x in overlapping:
print '{0} overlaps with {1}'.format(x[0],x[1])
# results:
# [100, 200] overlaps with [150, 250]
# [250, 500] overlaps with [300, 400]
# [10, 900] overlaps with [100, 200]
# [10, 900] overlaps with [150, 250]
# [10, 900] overlaps with [300, 400]
# [10, 900] overlaps with [250, 500]
# [-151, 32131] overlaps with [100, 200]
# [-151, 32131] overlaps with [150, 250]
# [-151, 32131] overlaps with [300, 400]
# [-151, 32131] overlaps with [250, 500]
# [-151, 32131] overlaps with [10, 900]
# [-151, 32131] overlaps with [1000, 12300]
# ['a', 'c'] overlaps with ['b', 'd']
Che cosa avete fino ad ora? – kindall
L'idea che questo debba contenere un ciclo for se non due ... – Robbie
Le voci sono ordinate? (E, se no, è ragionevole ordinarli prima? – abarnert