我有一个可能的选择列表:[[1], [2, 4], [4], [5, 6, 2], [5, 3]]。
我想列出所有组合,从每个子列表中最多获取一个元素,而不重复元素。
所以这[1, 2, 4, 5, 3]是一个有效的选择。但[1, 4, 4, 5, 3]事实并非如此。我允许不在任何子列表中做出选择,因此[1,4, None,5,3]是有效的,如[1, None, None, None, None]、 和中所示[None, None, None, None, None]。
我不能简单地枚举所有组合,然后过滤掉我不想要的组合,因为对于大量可能的选择,它很快就会在计算上变得不可行(我正在我的项目中查看 25^25 个最大组合)。
编辑:我还会对结果应用一些附加标准,例如过滤以不超过选择阈值None,或者按最少组合的顺序对结果组合列表进行排序None。
编辑:真实案例的详细信息:我想将其应用于 25 个子列表的列表,每个子列表可以有 1-25 个元素。实际上,每个子列表最多有 15 个元素,平均 2-4 个。
那么简单的过滤解决方案list(itertools.product(*choices))就出来了。
我可能还希望将其他过滤条件添加到组合列表中,因此理想情况下我可以预先过滤这些条件。
我尝试递归地构建一棵树,其中根节点具有完整的选择列表,子节点做出第一个选择[1],并且具有更新的选择列表,其中“1”从所有列表中删除[1:]选择。
但努力实现递归。
您能帮助我采取其他方法吗?