使用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()
它:itertools.product
和列表理解之間
>>> 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)]
時間比較:
>>> 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
這就是所謂的笛卡爾乘積。因此,itertools.product –