列表中组合的乘积之和

时间:2015-12-23 13:58:23

标签: python python-3.x functional-programming

将给定列表中所有组合的乘积相加的Pythonic方法是什么,例如:

[1, 2, 3, 4]
--> (1 * 2) + (1 * 3) + (1 * 4) + (2 * 3) + (2 * 4) + (3 * 4) = 35

(对于这个例子,我已经采用了所有的两元素组合,但它可能有所不同。)

4 个答案:

答案 0 :(得分:10)

使用itertools.combinations

>>> l = [1, 2, 3, 4]
>>> sum([i*j for i,j in list(itertools.combinations(l, 2))])
35

答案 1 :(得分:7)

>>> a = [1, 2, 3, 4]    
>>> import operator
>>> import itertools
>>> sum(itertools.starmap(operator.mul, itertools.combinations(l, 2)))
35

itertools.combinations(a, 2)返回:

>>> list(itertools.combinations(a, 2))
[(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]
>>> 

itertools.starmap()确实:

  

创建一个迭代器,使用从iterable获得的参数计算函数。当参数参数已经从单个可迭代的元组中分组时(数据已经“预压缩”),使用而不是map()

最后,使用sum()generator comprehension来获得最终结果。

答案 2 :(得分:2)

我不确定pythonic方式,但您可以将此问题解决为更简单的方法。

E.g。对于列表[a,b,c] =>结果也可以写成

( (a + b + c)^2 - (a^2 + b^2 + c^2) ) / 2

因此,它可以写成列表总和的平方和列表的平方和的平方差除以2。

您可以在python中实现以下相同:

a = [1,2,3,4]
( (sum(a) ** 2) - sum([x ** 2 for x in a]) ) / 2

P.S。我知道问题可以使用itertools解决,问题特别要求pythonic方法来解决它。我认为如果不尝试所有组合就可以轻松完成。

答案 3 :(得分:1)

这也是数组外部矢量乘积的上三角与其自身的总和:

import numpy as np
np.triu(np.outer([1,2,3,4],[1,2,3,4]),1).sum()
35

一步一步地工作如下:

# outer product
np.outer([1,2,3,4],[1,2,3,4])

array([[ 1,  2,  3,  4],
       [ 2,  4,  6,  8],
       [ 3,  6,  9, 12],
       [ 4,  8, 12, 16]])

# upper triangle
np.triu(np.outer([1,2,3,4],[1,2,3,4]),1)

array([[ 0,  2,  3,  4],
       [ 0,  0,  6,  8],
       [ 0,  0,  0, 12],
       [ 0,  0,  0,  0]])

# then the sum, which is the non-zero elements
np.triu(np.outer([1,2,3,4],[1,2,3,4]),1).sum()
35