PYTHON - 从一组多项选择中输出每个可能的结果?

时间:2013-02-03 01:59:18

标签: python permutation choice

这是非常基本的,但我不知道热议。

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

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)我会怎么做但我需要它才能为任意数量的选择工作。我毫不怀疑以前曾经问过这个问题,但我正在搜索的术语并没有改变。

1 个答案:

答案 0 :(得分: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(),它为我们提供了所有可能的组合,这就是你想要的。