将给定列表中所有组合的乘积相加的Pythonic方法是什么,例如:
[1, 2, 3, 4]
--> (1 * 2) + (1 * 3) + (1 * 4) + (2 * 3) + (2 * 4) + (3 * 4) = 35
(对于这个例子,我已经采用了所有的两元素组合,但它可能有所不同。)
答案 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)]
>>>
创建一个迭代器,使用从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