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)]

1行の答えは

[(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 に答える