我有一个11个数字的列表,我想根据某个规则(2 ^ 11种可能性)测试所有组合的乘积。
我遇到了this SO question,但似乎返回了所有组合的列表,我认为这会占用很多内存。
我的C ++思维是将每个二进制数0x001
到0x7FF
并乘以对应位为1的每个数字。
具有4个数字的示例:我的列表为[2, 3, 5, 7]
第一个二进制数为0001
,给出-2 = 2
稍后我们将转到1110
,乘积将为3 * 5 * 7 = 105
在python
中有更好的方法吗?一点操作似乎都不是正确的方法。
答案 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')
来减轻溢出问题。