我有一个数量 X 为 0 的列表(仅包含数字 0 或 1),例如 4:
[0,0,0,0]
我需要找到这些数字的所有可能组合,即:
[1,0,0,0], [0,1,0,0], [0,0,1,0], [1,1,0,0] ........ [1,1,1,1]
但这是很多组合,所以我不确定使用哪种方法。
我已经咨询了一种名为 Bitmask 的方法,它可以解决这个问题,我尝试使用嵌套的 for但它是不可能的。
这个问题有实用的方法或算法吗?
我有一个数量 X 为 0 的列表(仅包含数字 0 或 1),例如 4:
[0,0,0,0]
我需要找到这些数字的所有可能组合,即:
[1,0,0,0], [0,1,0,0], [0,0,1,0], [1,1,0,0] ........ [1,1,1,1]
但这是很多组合,所以我不确定使用哪种方法。
我已经咨询了一种名为 Bitmask 的方法,它可以解决这个问题,我尝试使用嵌套的 for但它是不可能的。
这个问题有实用的方法或算法吗?
itertools.product
正如评论中已经告诉您的那样,规范的答案是使用。但是,出于好奇,我忍不住实施了这个其他解决方案,利用这样一个事实,即在你生成的所有零和一的组合的深处,可以将其读取为 0 到之间所有数字的二进制编码。 2* *X(是
X
您正在考虑的“位数”,在您的情况下为四)。我坚持认为这只不过是一种好奇心。此版本比使用
itertools.product
.只要
0
y的数量1
是有界的,最基本的方法就是进行列表推导,如下所示:但最终,上述内容只不过是一个带有重复的笛卡尔积,您可以通过以下方式本地解决
itertools.product()
:重要的:
两种解决方案都提供了一个迭代器,因此有必要将它们转换为一个列表,例如打印值,但您必须小心这一点,因为当我们使用组合、排列或笛卡尔积时,这非常容易生成的元素数量激增,将结果具体化为列表或另一个对象可能会占用可用内存等等,更不用说执行此操作所需的时间了。