2010-05-30 4 views
1

J'ai deux listes en python et je veux savoir si elles se croisent au même index. Y a-t-il une façon mathématique de résoudre cela? Par exemple si j'ai [9,8,7,6,5] et [3,4,5,6,7] je voudrais une formule/algorithme simple et efficace qui trouve qu'à l'index 3 ils couper. Je sais que je pourrais faire une recherche en me demandant s'il y a un meilleur moyen.solution d'intersection set/line

Je sais qu'il existe une formule pour résoudre deux lignes dans la forme y = mx + b en les soustrayant les unes des autres mais ma "ligne" n'est pas vraiment une ligne car elle est limitée aux éléments de la liste et elle peut avoir des courbes.

Toute aide est appréciée.

Répondre

4

Vous pouvez prendre l'intersection ensembliste des coordonnées dans les deux listes , (1,8), (2,7), etc.

http://docs.python.org/library/stdtypes.html#set-types-set-frozenset

... sens? Bien sûr, cela ne vous donnera pas vraiment une intersection géométrique - par exemple, [1,2] croise [2,1] à [x = 0,5, y = 1,5] - si c'est ce que vous voulez, alors vous devez résoudre les équations linéaires à chaque intervalle.

+0

Vous avez raison, je ne le pensais pas à travers entièrement. J'ai besoin de résoudre les équations linéaires à chaque intervalle. – Xavier

+0

Equations linéaires? Dans votre question, vous avez dit qu'il pourrait y avoir des courbes. –

+0

Il peut y avoir des courbes. Mais je n'ai pas de formule pour la ligne. J'ai une série de points que je peux interpréter comme une série de segments de ligne. – Xavier

0

Je suppose qu'une dimension de votre liste est supposée, par ex. [9,8,7,6,5] sont les hauteurs à x1, x2, x3, x4, x5 à droite? Dans ce cas, comment votre liste va représenter des courbes comme y = 0?

Dans tous les cas, je ne pense pas qu'il puisse y avoir de raccourci pour calculer l'intersection de courbes génériques ou aléatoires, la meilleure solution est de faire une recherche efficace. (0,9) autrement dit, -

intersecting_points = set(enumerate(list1)).intersection(set(enumerate(list2))) 

... énumérer vous donne un itérables de tuples des index et des valeurs:

1
from itertools import izip 
def find_intersection(lineA, lineB): 
    for pos, (A0, B0, A1, B1) in enumerate(izip(lineA, lineB, lineA[1:], lineB[1:])): 
    #check integer intersections 
    if A0 == B0: #check required if the intersection is at position 0 
     return pos 
    if A1 == B1: #check required if the intersection is at last position 
     return pos + 1 
    #check for intersection between points 
    if (A0 > B0 and A1 < B1) or 
     (A0 < B0 and A1 > B1): 
     #intersection between pos and pos+1! 
     return pos + solve_linear_equation(A0,A1,B0,B1) 
    #no intersection 
    return None 

... où solve_linear_equation trouve l'intersection entre les segments (0,A0)→(1,A1) et (0,B0)→(1,B1).

0
import itertools 

def intersect_at_same_index(seq1, seq2): 
    return (
     idx 
     for idx, (item1, item2) 
     in enumerate(itertools.izip(seq1, seq2)) 
     if item1 == item2).next() 

Cela renverra l'index où les deux séquences ont des éléments égaux, et élever une StopIteration si toutes les paires d'objets sont différents. Si vous n'aimez pas ce comportement, placez l'instruction return dans une instruction try et, à la clause except StopIteration, renvoyez votre indicateur d'échec favori (par exemple -1, None ...)