Python:如何生成全因子组合?

时间:2017-06-14 20:25:00

标签: python itertools

如何使用python生成完整的因子组合?是否有一个花哨的itertools函数可以生成一个完整的阶乘?

我正在画一个空白,除了“完全因子组合”之外,我想不出另一种方式来描述这个,所以我的搜索工作已经没有任何相关性了。这里的术语是什么?搜索已经出现了一定长度的组合,但这不是我追求的。长度由因子数决定。

奖金:如何排除某些组合?如何处理具有任意数量级别的任意数量的因子,条件是“级别”不一定是字符串而是任何python对象?

假设我有5个因子,每个因子有两个或更多个等级。在这种情况下,我有3个两级因子和2个三级因子。组合的全因子将具有(2 ^ 3)*(3 ^ 2)= 8 * 9 = 72种组合。请注意,"L1"中的X1"L1"中的X2不同。

输入:

X1 = ["L1", "L2"]
X2 = ["L1", "L2", "L3"]
X3 = ["L1", "L2"]
X4 = ["L1", "L2"]
X5 = ["L1", "L2", "L3"]

full_factorial_combinations = itertools.fancyfunction(X1, X2, X3, X4, X5)
full_factorial_combinations #optionally produces a generator instead of list of tuples shown here

输出:

[("L1", "L1", "L1", "L1", "L1"),
("L1", "L1", "L1", "L1", "L2"),
("L1", "L1", "L1", "L1", "L3"),
("L1", "L1", "L1", "L2", "L1"),
("L1", "L1", "L1", "L2", "L2"),
("L1", "L1", "L1", "L2", "L3"),
("L1", "L1", "L2", "L1", "L1"),
("L1", "L1", "L2", "L1", "L2"),
("L1", "L1", "L2", "L1", "L3"),
("L1", "L1", "L2", "L2", "L1"),
("L1", "L1", "L2", "L2", "L2"),
("L1", "L1", "L2", "L2", "L3"),
("L1", "L2", "L1", "L1", "L1"),
("L1", "L2", "L1", "L1", "L2"),
("L1", "L2", "L1", "L1", "L3"),
("L1", "L2", "L1", "L2", "L1"),
("L1", "L2", "L1", "L2", "L2"),
("L1", "L2", "L1", "L2", "L3"),
("L1", "L2", "L2", "L1", "L1"),
("L1", "L2", "L2", "L1", "L2"),
("L1", "L2", "L2", "L1", "L3"),
("L1", "L2", "L2", "L2", "L1"),
("L1", "L2", "L2", "L2", "L2"),
("L1", "L2", "L2", "L2", "L3"),
("L1", "L3", "L1", "L1", "L1"),
("L1", "L3", "L1", "L1", "L2"),
("L1", "L3", "L1", "L1", "L3"),
("L1", "L3", "L1", "L2", "L1"),
("L1", "L3", "L1", "L2", "L2"),
("L1", "L3", "L1", "L2", "L3"),
("L1", "L3", "L2", "L1", "L1"),
("L1", "L3", "L2", "L1", "L2"),
("L1", "L3", "L2", "L1", "L3"),
("L1", "L3", "L2", "L2", "L1"),
("L1", "L3", "L2", "L2", "L2"),
("L1", "L3", "L2", "L2", "L3"),
("L2", "L1", "L1", "L1", "L1"),
("L2", "L1", "L1", "L1", "L2"),
("L2", "L1", "L1", "L1", "L3"),
("L2", "L1", "L1", "L2", "L1"),
("L2", "L1", "L1", "L2", "L2"),
("L2", "L1", "L1", "L2", "L3"),
("L2", "L1", "L2", "L1", "L1"),
("L2", "L1", "L2", "L1", "L2"),
("L2", "L1", "L2", "L1", "L3"),
("L2", "L1", "L2", "L2", "L1"),
("L2", "L1", "L2", "L2", "L2"),
("L2", "L1", "L2", "L2", "L3"),
("L2", "L2", "L1", "L1", "L1"),
("L2", "L2", "L1", "L1", "L2"),
("L2", "L2", "L1", "L1", "L3"),
("L2", "L2", "L1", "L2", "L1"),
("L2", "L2", "L1", "L2", "L2"),
("L2", "L2", "L1", "L2", "L3"),
("L2", "L2", "L2", "L1", "L1"),
("L2", "L2", "L2", "L1", "L2"),
("L2", "L2", "L2", "L1", "L3"),
("L2", "L2", "L2", "L2", "L1"),
("L2", "L2", "L2", "L2", "L2"),
("L2", "L2", "L2", "L2", "L3"),
("L2", "L3", "L1", "L1", "L1"),
("L2", "L3", "L1", "L1", "L2"),
("L2", "L3", "L1", "L1", "L3"),
("L2", "L3", "L1", "L2", "L1"),
("L2", "L3", "L1", "L2", "L2"),
("L2", "L3", "L1", "L2", "L3"),
("L2", "L3", "L2", "L1", "L1"),
("L2", "L3", "L2", "L1", "L2"),
("L2", "L3", "L2", "L1", "L3"),
("L2", "L3", "L2", "L2", "L1"),
("L2", "L3", "L2", "L2", "L2"),
("L2", "L3", "L2", "L2", "L3")]

2 个答案:

答案 0 :(得分:2)

这被称为笛卡尔积,由itertools.product实现。

itertools.product(X1, X2, X3, X4, X5)

答案 1 :(得分:0)

这是工作代码:

import itertools
X1 = ["L1", "L2"]
X2 = ["L1", "L2", "L3"]
X3 = ["L1", "L2"]
X4 = ["L1", "L2"]
X5 = ["L1", "L2", "L3"]
number=1
for combination in itertools.product(X1,X2,X3,X4,X5):
    print number, combination
    number+=1

您可以轻松修改上述代码以执行所需任务。