【发布时间】:2019-07-30 18:26:53
【问题描述】:
我接到了一项奇怪的任务,要从 33 种不同的产品中找出一种产品组合,以达到一定的总销售额。可能的组合显然是 2^33。当我使用下面的代码时,它显示“内存错误”。我的win10桌面装了64G内存。好消息是我使用 Excel VBA 解决了这个问题,花了几个小时才得到结果。有没有人有想法来处理这类问题?使用发电机?还是 PD 数据帧?谢谢!
import numpy as np
import itertools, sys
a1 = [4435.48, 327.96, 23.26, 4136.78, 77.06, 158.73, 1389.34,
820.32, 888.33, 3735.7, 201.78, 31.17, 250.04, 87.17, 3230.95,
491.53, 47.11, 508.22, 52.22, 1255.98, 3755.11, 948.4, 905.44,
80.41, 1323.68, 528.57, 1474.4, 83.98, 756.87, 310.68, 27.86,]
n = len(a1)
lst = [list(i) for i in itertools.product([0, 1], repeat=n)]
for g in lst:
c = sum(np.multiply(g, a1))
if abs(c - 11833) < 1:
print (g)
sys.exit()
【问题讨论】:
-
itertools.productis 一个迭代器 - 问题是你将它包装在一个列表理解中。反复使用它,你不应该遇到内存问题。 -
您有change-making problem 的变体,并且解决方案不需要暴力破解所有组合。
-
@juanpa.arrivillaga - 非常正确 - 正好赶上我编辑 :)
-
谢谢各位!我对 Python 非常陌生。 “迭代地使用它”你能详细说明一下吗? @match。
-
@LarryZ 不要从你的
product迭代器中实现一个列表,即你做了lst = [list(i) for i in itertools.product([0, 1], repeat=n)]你不需要一个列表,你想迭代迭代器中的值。从字面上用lst = itertools.product([0, 1], repeat=n)替换该行,并且可能选择lst以外的其他名称,因为它不是一个列表。
标签: python python-3.x list