1

这是非常基本的,但我不知道如何去做。

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

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

1 回答 1

4

这可以通过itertools.product()列表理解来完成:

>>> 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]],无论哪种方式都可以工作 - 因为无论如何你在这里使用它,它不值得xrange()在 2.x 中使用,除非你特别喜欢它)。

然后我们将其解压缩itertools.product(),它为我们提供了所有可能的组合,这就是您想要的。

于 2013-02-03T02:03:37.067 回答