2016-08-06 6 views
0

У меня есть два списка списков, состоящих из интервала реальной линиидекартово произведение перекрытия списка интервалов

I = [[8,12], [18,24], [3,5]] 
J = [[7,10], [2,6], [18,22]] 

Я хочу, чтобы gernerate список, содержащий пары интервалов из I и J, которые пересекаются. Например, один элемент списка будет [[8,12], [7,10]]. У меня есть цикл, который делает это

res=[] 
for i in range(len(I)): 
    des=[] 
    for j in range(len(J)): 
     if (I[i][1]<=J[j][1] and I[i][1]>=J[j][0]) or (J[j][1]<=I[i][1] and J[j][1]>=I[i][0]): 

      z=[I[i],J[j]] 
      res.append(z) 

, который дает

res=[[[8, 12], [7, 10]], [[18, 24], [18, 22]], [[3, 5], [2, 6]]] 

, но я пытаюсь найти уборщик более эффективную версию

можно перекрывающиеся интервалы в каждом отдельном списке. Например, мы могли бы

I= [ [2,5], [1,4] ] 

и

J= [[3,7], [10,12]] 

в этом случае список будет результат

[ [[1,4], [3,7]], [[2,5],[3,7]] 
+0

Пропала некоторая информация. например, может ли быть множество перекрывающихся блоков? Могут ли быть перекрывающиеся блоки? Как его хранить в таком случае? – Prophecies

+0

@Prophecies. Надеюсь, я ответил на ваш вопрос в моих праведниках. Я предполагаю, что вы имеете в виду перекрывающиеся блоки в каждом исходном списке – mikeL

+0

Спасибо за разъяснение, и похоже, что @Keith ответил на ваш вопрос. – Prophecies

ответ

0

Это может быть сделано немного более читаемый usin g enumerate, чтобы вытащить индекс и значения в одно и то же время. Кроме того, семантически пары чисел могут быть лучше описаны как кортежи.

I = [(8,12), (18,24), (3,5)] 
J = [(7,10), (2,6), (18,22)] 

def overlap(I, J): 
    res=[] 
    for i, ival in enumerate(I): 
     for j, jval in enumerate(J): 
      if (ival[1]<=jval[1] and ival[1]>=jval[0]) or (jval[1]<=ival[1] and jval[1]>=ival[0]): 
       z = (ival, jval) 
       res.append(z) 
    return res 

res = overlap(I, J) 
print(res) 
assert res == [((8, 12), (7, 10)), ((18, 24), (18, 22)), ((3, 5), (2, 6))] 

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

def overlap(I, J): 
    res=[] 
    for ival in I: 
     for jval in J: 
      if (ival[1]<=jval[1] and ival[1]>=jval[0]) or (jval[1]<=ival[1] and jval[1]>=ival[0]): 
       z = (ival, jval) 
       res.append(z) 
    return res 
-1

Это должно сделать

import itertools 

I = [[8,12], [18,24], [3,5]] 
J = [[7,10], [2,6], [18,22]] 

z = [] 
for x,y in itertools.product(I,J): 
     #find intersection via sets 
     if set(range(x[0],x[1])) & set(range(y[0],y[1])): 
      z.append([x,y]) 

print z 
Смежные вопросы