问题描述
我正在尝试创建一个包含多项选择测验的所有可能答案组合的列表。测验中有 30 个问题,有 4 个可能的答案:['agree','disagree','neither','skip']
。输出应该是包含 30 个问题的所有可能答案组合的子列表列表,例如:
[['agree','agree','agree'],['agree','disagree'],etc. ...]
有一个警告:skip
的回答只能达到最大值。每个测验 15 个问题。
看来 itertools.product
是最直接的解决方案,所以我尝试了:
from itertools import product
combinations = product(['agree','skip'],repeat=30)
然而,这是非常低效的内存,并且不断使我的 Colab 会话崩溃。是否有一种内存效率高的解决方案实际上可以让我生成测验答案的组合,最重要的是:我如何实现每个测验最多 15 个 skip
答案?
解决方法
你在使用 python2 吗?
Python3 的 itertool.product 不应该使您的 RAM 爆炸。它应该只是一个生成器。
您的代码应该按原样工作,但是它会运行很长一段时间(正如其他人指出的那样,“相当长的时间”意味着您不希望用计算机的计算能力等待一段时间。如果我没有算错,如果你的电脑每秒能处理 100 万个组合,你就得等上大约 36000 年)
In [21]: 4**30 / 10**6 / 60 / 60 / 24 / 365
Out[21]: 36558.901084692
请使用 python 3 运行以下代码:
choices = ['agree','disagree','neither','skip']
for i,answer in enumerate(itertools.product(choices,repeat=30)):
pass
print(i)
使用您的流程监视器,您应该会看到,您的流程不需要 大量内存,但只是大量 CPU。
只有最多 15 个跳过值的答案的蛮力解决方案是获取所有可能性并拒绝具有更多可能性的那些。
另一种方法是首先创建所有答案,其中仅包含
['agree','neither']
,
然后所有答案正好是 1 'skip'
,在所有可能的位置跳过
然后所有答案都恰好是 2 'skip'
秒,并在所有可能无法区分的位置上跳过。
...