2013-02-03 32 views
1

这是非常基本的,但我不知道它会发生什么。PYTHON - 从一系列多种选择中输出每种可能的结果?

假设我有一个“选择”列表作为输入。例如:

c = [2,3,2] 

这表示3个选项,包含2个选项,3个选项,然后是2个选项。作为一个输出,我需要像这样:

[1,1,1] 
[1,1,2] 
[1,2,1] 
[1,2,2] 
[1,3,1] 
[1,3,2] 
[2,1,1] 
[2,1,2] 
[2,2,1] 
[2,2,2] 
[2,3,1] 
[2,3,2] 

所以每个选择的排列。我知道如果每次选择相同数量的选择(例如3),我会怎么做,但我需要它为任何数量的选择工作。毫无疑问,这个问题之前已经提出过,但我正在寻找的术语并没有改变任何事情。

回答

4

这可以用itertools.product()完成和list comprehension

>>> list(itertools.product(*[range(1, j+1) for j in c])) 
[(1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2), (1, 3, 1), (1, 3, 2), (2, 1, 1), (2, 1, 2), (2, 2, 1), (2, 2, 2), (2, 3, 1), (2, 3, 2)] 

我们遍历列表,并创建代表每一列的潜力值的范围。

>>> [range(1, j+1) for j in c] 
[range(1, 3), range(1, 4), range(1, 3)] 

(我用3.x和range()给出了一个发电机,在2.x中,这将是一个清单,如:[[1, 2], [1, 2, 3], [1, 2]],它仍然可以正常工作 - 因为你在这里消费也无妨,它不是除非你特别喜欢,否则在2.x中值得使用xrange())。

然后我们将其解压到itertools.product(),它给了我们所有可能的组合,这就是你想要的。

+0

那很简单。我并不了解itertools的产品功能,现在我已经做了演示。谢谢。 – user2036366