2016-08-06 15 views
0

Ich habe zwei Listen von Listen-Intervall aus der reellen Achsekartesisches Produkt von überlappenden Liste von Intervallen

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

I eine Liste gernerate wollen, daß die Paare von Intervallen von I und J enthält, die sich überlappen. Zum Beispiel wäre ein Element der Liste [[8,12], [7,10]]. Ich habe eine Schleife, die dies tut

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) 

die

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

liefert aber ich versuche, eine sauberere effizientere Version

Es ist möglich, überlappende Intervalle in jeder separaten Liste zu finden. Zum Beispiel könnten wir

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

und

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

in diesem Fall der Liste haben das Ergebnis

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

Es fehlen einige Informationen. Kann es beispielsweise mehrere überlappende Blöcke geben? Kann es keine überlappenden Blöcke geben? Wie sollte es in diesen Fällen gespeichert werden? – Prophecies

+0

@Prophezies. Hoffentlich habe ich deine Frage in meinen Änderungen beantwortet. Ich nehme an, du meinst überlappende Blöcke in jeder ursprünglichen Liste – mikeL

+0

Danke für die Klarstellung und es sieht aus wie @Keith hat Ihre Frage beantwortet. – Prophecies

Antwort

0

soll tun würde dazu gemacht werden, ein wenig lesbarer von uns g enumerate, um den Index und die Werte gleichzeitig zu ziehen. Auch könnten die Zahlenpaare semantisch besser als Tupel beschrieben werden.

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))] 

Aber da der Index verwendet werden soll, nicht hat, kann dies noch weiter, indem nur über die Werte Looping vereinfacht werden.

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

Diese

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 
Verwandte Themen