2017-06-14 104 views
0

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

我画了一个空白,想不到另一种方式来描述这个比“完全因子的组合”,所以我的搜索努力没有出现任何相关。这里有什么正确的术语?搜索已经结合了某些长度的组合,但那不是我所追求的。长度由多少因素决定。

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

比方说,我有5个因素,每个因素有两个或更多的水平。在这种情况下,我有三个两级因素和两个三级因素。组合的全因子将具有(2^3)*(3^2)= 8 * 9 = 72个组合。请记住,X1中的"L1"X2中的"L1"不同。

输入:

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

这就是所谓的笛卡尔乘积由itertools.product实现。

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

docs链接:https://docs.python.org/3.6/library/itertools.html#itertools.product – Will

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 

您可以轻松地修改上面的代码来执行所需的任务。