2016-01-11 17 views
6

Ho una lista in Python che assomiglia a questo:Sottrarre tutti gli elementi di un elenco contro l'altro

myList = [(1,1),(2,2),(3,3),(4,5)] 

E voglio sottrarre ogni elemento con gli altri, come questo:

(1,1) - (2,2) 
(1,1) - (3,3) 
(1,1) - (4,5) 
(2,2) - (3,3) 
(2,2) - (4,5) 
(3,3) - (4,5) 

Il risultato atteso sarebbe un elenco con le risposte:

[(1,1), (2,2), (3,4), (1,1), (2,3), (1,2)] 

Come posso fare questo? Se mi avvicino con un ciclo for, posso forse memorizzare l'elemento precedente e confrontarlo con quello con cui sto lavorando in quel momento, ma in realtà non funziona.

+0

cosa è '(1, 1) - (2, 2)'? '(-1, -1)' o qualcos'altro? –

+0

@BoristheSpider, yes, (-1, -1) o (1,1). O, non mi interessa il segno. – coconut

risposta

12

Usa itertools.combinations con tuple disimballaggio per generare le coppie di differenze:

>>> from itertools import combinations 
>>> [(y1-x1, y2-x2) for (x1, x2), (y1, y2) in combinations(myList, 2)]      
[(1, 1), (2, 2), (3, 4), (1, 1), (2, 3), (1, 2)] 
4

Si potrebbe utilizzare una lista di comprensione, con np.subtract a 'togliere' le tuple tra loro:

import numpy as np 

myList = [(1,1),(2,2),(3,3),(4,5)] 

answer = [tuple(np.subtract(y, x)) for x in myList for y in myList[myList.index(x)+1:]] 
print(answer) 

uscita

[(1, 1), (2, 2), (3, 4), (1, 1), (2, 3), (1, 2)] 
1

Utilizzo di operator.sub con combinations.

>>> from itertools import combinations 
>>> import operator 
>>> myList = [(1, 1),(2, 2),(3, 3),(4, 5)] 
>>> [(operator.sub(*x), operator.sub(*y)) for x, y in (zip(ys, xs) for xs, ys in combinations(myList, 2))] 
[(1, 1), (2, 2), (3, 4), (1, 1), (2, 3), (1, 2)] 
>>> 
Problemi correlati