2016-01-11 20 views
6

mam listę w Pythonie, który wygląda tak:odjąć wszystkie pozycje na liście przed siebie

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

I chcę, aby odjąć każdą pozycję z innymi, tak:

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

Oczekiwany wynik będzie lista z odpowiedziami:

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

Jak mogę to zrobić? Jeśli podejdę do tego z pętlą for, może uda mi się zapisać poprzedni element i sprawdzić go w stosunku do tego, nad którym pracuję, ale tak naprawdę nie działa.

+0

co to jest '(1, 1) - (2, 2)'? '(-1, -1)' lub coś innego? –

+0

@BoristheSpider, tak, (-1, -1) lub (1,1). Albo nie dbam o znak. – coconut

Odpowiedz

12

Zastosowanie itertools.combinations z krotka rozpakowaniu do generowania pary różnice:

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

Można użyć wyrażeń listowych, z np.subtract do „odjąć” na krotki od siebie:

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) 

Wyjście

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

Używanie operator.sub z .

>>> 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)] 
>>> 
Powiązane problemy