2016-01-11 3 views
6

У меня есть список в Python, который выглядит следующим образом:Вычтите все элементы в списке друг против друга

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

И я хочу, чтобы вычесть каждый элемент с другими, как это:

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

Ожидаемый результат был бы список с ответами:

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

Как я могу это сделать? Если я подхожу к нему с помощью цикла for, я могу, возможно, сохранить предыдущий элемент и проверить его на тот, с которым я работаю в данный момент, но на самом деле это не работает.

+0

что такое '(1, 1) - (2, 2)'? '(-1, -1)' или что-то еще? –

+0

@BoristheSpider, да, (-1, -1) или (1,1). Либо я не забочусь о знаке. – coconut

ответ

12

Использование itertools.combinations с кортежем распаковке для создания пары разницы:

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

Вы можете использовать список понимание, с np.subtract на «вычесть» кортежи друг от друга:

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) 

Выход

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

Использование operator.sub с 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)] 
>>> 
Смежные вопросы