这个问题在这里已有答案:
我有一个11个数字的列表,我想测试所有组合的产品对一些规则(2 ^ 11种可能性)。
我遇到了this SO question,但它似乎返回了所有组合的列表,我认为这将占用大量内存。
我的C ++思想是通过每个二进制数0x001
到0x7FF
并将每个数字乘以其相应的位为1。
4个数字的示例:我的列表是[2, 3, 5, 7]
第一个二进制数将是0001
给出 - 2 = 2
稍后我们将到达1110
,产品将是3 * 5 * 7 = 105
在python
有更好的方法吗?有点操纵似乎不是正确的方法。
可能不是最好的解决方案,但应该没有长列表的内存问题(正如在评论中所说,使用迭代(使用“功能”方法)不应该让你招致内存问题)。
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')
以缓解溢出问题。