这是非常基本的,但我不知道热议。
假设我有一个“选择”列表作为输入。例如:
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)我会怎么做但我需要它才能为任意数量的选择工作。我毫不怀疑以前曾经问过这个问题,但我正在搜索的术语并没有改变。
答案 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()
,它为我们提供了所有可能的组合,这就是你想要的。