Python 计算列表所有组合的乘积

Python 计算列表所有组合的乘积,python,combinatorics,Python,Combinatorics,我有一个11个数字的列表,我想根据一些规则测试所有组合的乘积(2^11的可能性) 我遇到过,但它似乎返回了所有组合的列表,我认为这将占用大量内存 我的C++思想是把每个二进制数 0x00 1 < /代码>到 0x7FF并将每个位数乘以1对应的比特。 有4个数字的示例:我的列表是[2,3,5,7] 第一个二进制数是0001giving-2=2 稍后我们将到达1110,产品将是3*5*7=105 在python中是否有更好的方法来实现这一点?位操作似乎不是正确的方法。一个使用iterables的解决

我有一个11个数字的列表,我想根据一些规则测试所有组合的乘积(2^11的可能性)

我遇到过,但它似乎返回了所有组合的列表,我认为这将占用大量内存

<>我的C++思想是把每个二进制数<代码> 0x00 1 < /代码>到<代码> 0x7FF并将每个位数乘以1对应的比特。 有4个数字的示例:我的列表是
[2,3,5,7]

第一个二进制数是
0001
giving-2=2

稍后我们将到达
1110
,产品将是
3*5*7=105


python
中是否有更好的方法来实现这一点?位操作似乎不是正确的方法。

一个使用iterables的解决方案应该能够处理没有内存问题的长列表(使用“功能”方法):

import itertools
from functools import partial
import numpy as np

my_list = [1,3,5,7,9,11,13,15,17,19,21]

# define helper partial function useful to return an iterable of combinations with r elements
combinations_with_r = partial(lambda r: itertools.combinations(my_list, r = r))

# generate all combinations, print them with their products
for r in map(combinations_with_r, range(1, len(my_list) + 1)):
    for j in r:
        print(j, np.prod(j))

您可以声明
my_list=np.array([1,3,5,7,9,11,13,15,17,19,21],dtype='int64')
以缓解溢出问题。

@Bazingaa感谢您的编辑。在meta上发布了一些奇怪的格式错误是的,你是对的。有11个!列表顺序的组合,但顺序对于乘法并不重要,因此它将减少到2^11。
itertools。排列
返回一个iterable(不是列表),所以你不必担心内存。如果我在打印
j,np.prod(j)
的地方计算排列,它在2046出现,看起来很低。np.prod的一些结果也给出了负数。numpy在下面使用签名整数吗?嗨!它们应该是2^11=2048。我在我的输出中没有看到负积,你能举一个例子说明示例
my_list
组合的这种行为吗?对不起,计数是正确的。下面是一些否定的例子(2,3,5,7,11,13,17,23,29,31)1965880678(2,3,5,7,11,13,29,31)-1087225998(2,3,5,7,11,17,19,23,29,31)-1752139174(2,3,5,7,13,17,17,19,19,23,29,31)1052902646(2,3,5,11,13,17,19,23,29,31)-1413272482(2,5,7,11,13,17,19,23,29,31)-1865980026(3,5,7,11,13,17,19,23,29,31)1495997257出于某种原因,我在numpy上的版本似乎使用了有符号的32位整数。(2,5,7,11,13,17,19,23,29,31)-1865980026应该是66853496710减去2^31 32次给我们留下-1865980026不会在我的环境中溢出,但是可能声明
my_list=np.array([1,3,5,7,9,11,13,15,17,19,21],dtype='float64')
可能会给你的(?)多一点空间。