配置空间模型中的所有可能组合

时间:2013-07-11 11:58:29

标签: python combinations

我需要从具有选项的空间生成所有可能的组合,并且每个选项都有自己的值。

举个例子,

option 1: {1,2,3}
option 2: {4,5}
option 3: {2,3}

组合将采用格式,(v1,v2,v3),即v1,v2和v3分别来自选项1,选项2和选项3。我将输出12个列表,如下所示;

(1,4,2), (1,4,3), (1,5,2), (1,5,3), (2,4,2), (2,4,3), (2,5,2), (2,5,3), (3,4,2), (3,4,3), (3,5,2), (3,5,3)

我该怎么做?

2 个答案:

答案 0 :(得分:2)

使用itertools.product()生成所有组合:

>>> from itertools import product
>>> option1 = {1, 2, 3}
>>> option2 = {4, 5}
>>> option3 = {2, 3}
>>> for tup in product(option1, option2, option3):
...     print tup
... 
(1, 4, 2)
(1, 4, 3)
(1, 5, 2)
(1, 5, 3)
(2, 4, 2)
(2, 4, 3)
(2, 5, 2)
(2, 5, 3)
(3, 4, 2)
(3, 4, 3)
(3, 5, 2)
(3, 5, 3)

itertools.product()生成器;当for循环遍历它时,它会按需生成组合,或者您可以每次使用next()函数询问它是否有新的组合。这使得itertools.product()非常有效。因为它完全用C实现,itertools.product()也非常,比列表理解更快。

要生成列表,请在其上调用list()

>>> list(product(option1, option2, option3))
[(1, 4, 2), (1, 4, 3), (1, 5, 2), (1, 5, 3), (2, 4, 2), (2, 4, 3), (2, 5, 2), (2, 5, 3), (3, 4, 2), (3, 4, 3), (3, 5, 2), (3, 5, 3)]

itertools.product与列表理解之间的时间比较:

>>> timeit.timeit("list(product(option1, option2, option3))", "from __main__ import option1, option2, option3, product")
1.6326439380645752
>>> timeit.timeit("[(x, y, z) for x in option1 for y in option2 for z in option3]", "from __main__ import option1, option2, option3, product")
2.2882919311523438

答案 1 :(得分:0)

您可以在Python中使用Comprehension来完成此操作。

>>> op1 = {1,2,3}
>>> op2 = {4,5}
>>> op3={2,3}
>>> ans = [(x,y,z) for x in op1 for y in op2 for z in op3]
>>> ans
[(1, 4, 2), (1, 4, 3), (1, 5, 2), (1, 5, 3), (2, 4, 2), (2, 4, 3), (2, 5, 2), (2
, 5, 3), (3, 4, 2), (3, 4, 3), (3, 5, 2), (3, 5, 3)]

一行答案是

[(x,y,z) for x in {1,2,3} for y in {4,5} for z in {2,3}]