0

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

举个例子,

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)

我怎样才能做到这一点?

4

2 回答 2

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
于 2013-07-11T12:02:08.297 回答
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}]
于 2013-07-11T12:03:12.150 回答