计算python列表中所有数字的所有乘积

计算python列表中所有数字的所有乘积,python,Python,假设我有以下清单: [2,3,5,7] 我想输出所有乘法组合: [6,10,14,15,21,35,30,42,105,210] python中是否有一个用于此的行程序?假设您忘记了输出中的70 使用numpy.prod和itertools.compositions: >>> from numpy import prod >>> from itertools import combinations >>> lst = [2,3,5,7]

假设我有以下清单:

[2,3,5,7] 
我想输出所有乘法组合:

[6,10,14,15,21,35,30,42,105,210]

python中是否有一个用于此的行程序?

假设您忘记了输出中的70

使用
numpy.prod
itertools.compositions

>>> from numpy import prod
>>> from itertools import combinations
>>> lst = [2,3,5,7]
>>> [prod(x) for i in range(2, len(lst)+1) for x in combinations(lst, i)]
[6, 10, 14, 15, 21, 35, 30, 42, 70, 105, 210]

Itertools是个好方法。作为替代解决方案,纯numpy解决方案(所有0,1,…,n项产品):

在大型列表中,速度可提高40倍

一些解释:

按位_和.outer(arange(2**n),2**arange(n))

array([[0, 0, 0, 0],
       [1, 0, 0, 0],
       [0, 2, 0, 0],
       [1, 2, 0, 0],
       [0, 0, 4, 0],
       [1, 0, 4, 0],
       [0, 2, 4, 0],
       [1, 2, 4, 0],
       [0, 0, 0, 8],
       [1, 0, 0, 8],
       [0, 2, 0, 8],
       [1, 2, 0, 8],
       [0, 0, 4, 8],
       [1, 0, 4, 8],
       [0, 2, 4, 8],
       [1, 2, 4, 8]], dtype=int32)
array([[1, 1, 1, 1],
       [2, 1, 1, 1],
       [1, 3, 1, 1],
       [2, 3, 1, 1],
       [1, 1, 5, 1],
       [2, 1, 5, 1],
       [1, 3, 5, 1],
       [2, 3, 5, 1],
       [1, 1, 1, 7],
       [2, 1, 1, 7],
       [1, 3, 1, 7],
       [2, 3, 1, 7],
       [1, 1, 5, 7],
       [2, 1, 5, 7],
       [1, 3, 5, 7],
       [2, 3, 5, 7]])
其中(按位_和.outer(arange(2**n),2**arange(n))>0,a,1)

array([[0, 0, 0, 0],
       [1, 0, 0, 0],
       [0, 2, 0, 0],
       [1, 2, 0, 0],
       [0, 0, 4, 0],
       [1, 0, 4, 0],
       [0, 2, 4, 0],
       [1, 2, 4, 0],
       [0, 0, 0, 8],
       [1, 0, 0, 8],
       [0, 2, 0, 8],
       [1, 2, 0, 8],
       [0, 0, 4, 8],
       [1, 0, 4, 8],
       [0, 2, 4, 8],
       [1, 2, 4, 8]], dtype=int32)
array([[1, 1, 1, 1],
       [2, 1, 1, 1],
       [1, 3, 1, 1],
       [2, 3, 1, 1],
       [1, 1, 5, 1],
       [2, 1, 5, 1],
       [1, 3, 5, 1],
       [2, 3, 5, 1],
       [1, 1, 1, 7],
       [2, 1, 1, 7],
       [1, 3, 1, 7],
       [2, 3, 1, 7],
       [1, 1, 5, 7],
       [2, 1, 5, 7],
       [1, 3, 5, 7],
       [2, 3, 5, 7]])

然后,
prod
逐行进行。

一个不需要额外工具的复杂的单行程序

假设初始列表位于变量
l
中:

[ list(l[k] for k in range(len(l))
    if (2**k) & (n+(n+n.bit_length()).bit_length()))
    for n in range(1,2**len(l)-len(l)) ]
返回所需的组合(只需使用一些
reduce
来包装初始列表,以执行乘法本身,但棘手的部分就在那里)。“gem”是
n+(n+n.bit_length()).bit_length()
,它将正整数映射到包含至少两个位集的整数序列(在二进制扩展中),用于通过确保每次至少取两个位集来选择初始列表的成员。关于这个公式,您可以在了解更多信息(我只是对前面链接“公式”部分中的第一个表达式Python语法进行了修改)

因此,整个答案将是:

[ reduce(int.__mul__,
    (l[k] for k in range(len(l))
        if (2**k) & (n+(n+n.bit_length()).bit_length())))
        for n in range(1,2**len(l)-len(l)) ]

(如果您使用的是Python 3,则需要导入
reduce

到目前为止,您实际尝试了什么?我在谷歌上搜索了很多东西,试图找到一些东西,但它看起来像map、reduce等,可能马上就帮不上忙,这并不能回答我的问题。你的密码在哪里?你有没有研究过
itertools
排序({a*b为(a,b)的组合(值,2)})
@PeterWood-Nope-它包括其他组合(例如
210
is
2*3*5*7
)。我没有使用numpy包,所以我使用了:
reduce(lambda x,y:x*y,numbers)
不需要为此导入
numpy
task@Argman是的,使用reduce而不是
numpy.prod是可能的,但我认为它更难阅读。如果您不能使用numpy,reduce(或编写您自己的prod函数)是有效的回退解决方案。@timgeb我认为
reduce
不难理解,但也许您是对的。这使用了
powerset
Nice的一个特例,但您能解释一下发生了什么吗?如何防止结果中出现值1、2、3、5、7?已编辑。精确解分为两行:
y=bitwise_和.outer(arange(2**n),2**arange(n))>0;res=其中(y,a,1).prod(1)[y.sum(1)>1]
。但限制2个或更多操作数在数学上对我来说是一个难看的问题(对计算机也是如此…)