计算列表所有组合的乘积

时间:2018-09-06 09:37:25

标签: python combinatorics

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

我遇到了this SO question,但似乎返回了所有组合的列表,我认为这会占用很多内存。

我的C ++思维是将每个二进制数0x0010x7FF并乘以对应位为1的每个数字。

具有4个数字的示例:我的列表为[2, 3, 5, 7]

第一个二进制数为0001,给出-2 = 2

稍后我们将转到1110,乘积将为3 * 5 * 7 = 105

python中有更好的方法吗?一点操作似乎都不是正确的方法。

1 个答案:

答案 0 :(得分:1)

可能不是有史以来最好的解决方案,但是应该可以解决长列表中的内存问题(如评论中所述,使用可迭代对象(采用“功能”方法)不应使您陷入内存问题)。

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')来减轻溢出问题。