将列表中的所有项目相互相减

Subtract all items in a list against each other

提问人:coconut 提问时间:1/11/2016 最后编辑:Alex Rileycoconut 更新时间:1/11/2016 访问量:2444

问:

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

Python 列表 元组 组合

评论

0赞 Boris the Spider 1/11/2016
什么? 还是别的什么?(1 , 1) - (2 , 2)(-1, -1)
0赞 coconut 1/11/2016
@BoristheSpider,是的,(-1,-1)或(1,1)。要么,我不在乎标志。

答:

5赞 gtlambert 1/11/2016 #1

您可以使用列表推导法,从彼此中“减去”元组: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)]
13赞 Alex Riley 1/11/2016 #2

与元组解包一起使用以生成差异对: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)]
1赞 styvane 1/11/2016 #3

operator.sub组合一起使用。

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