2017-03-06 17 views
7

私は2つのリストを持っています以下の例のようにペア(またはトリプルなど):組み合わせは

これは実際にはlen(b) ** len(a)の組み合わせの数を示します。

c = ["a_1 b_1", "a_1 b_2", "a_1 b_3", "a_2 b_1", "a_2 b_2", "a_2 b_3", "a_3 b_1", "a_3 b_2" "a_3 b_3"] 

Iは、(hereが記載されているように)itertools.productを使用することを試みたが、これは、6つの可能な組み合わせを与えます。

答えて

14

itertools.product(..)を使用できますが、repeatrepeat=len(a)と指定してください。だから、あなたが使用することができます。

from itertools import product 

def mul_product(a,b): 
    for tup in product(b,repeat=len(a)): 
     yield ' '.join('%s_%s'%t for t in zip(a,tup)) 

product(..)のようなタプルが生成されます。だからここ

>>> list(product(b,repeat=len(a))) 
[(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)] 

をタプルの最初の要素はa_に装着されている1、b_に2番目です。それらは

>>> list(map(lambda bi:list(zip(a,bi)),product(b,repeat=len(a)))) 
[[('a', 1), ('b', 1)], [('a', 1), ('b', 2)], [('a', 1), ('b', 3)], [('a', 2), ('b', 1)], [('a', 2), ('b', 2)], [('a', 2), ('b', 3)], [('a', 3), ('b', 1)], [('a', 3), ('b', 2)], [('a', 3), ('b', 3)]] 

今ではフォーマットの問題だけ('%s_%s'%t)であり、それらining ' '.join(..)一緒にyield(またはあなたがリストを生成するために、リストの内包表記を使用することができます。今、私たちは生産、aリストと一緒にそれらをzip(..) )。

あなたのサンプル入力の結果は次のとおりです。ここでは要素が遅延して生成されること

>>> list(mul_product(a,b)) 
['a_1 b_1', 'a_1 b_2', 'a_1 b_3', 'a_2 b_1', 'a_2 b_2', 'a_2 b_3', 'a_3 b_1', 'a_3 b_2', 'a_3 b_3'] 

注意。これは、例えば、最初のkに興味がある場合や、すべてを一度に生成したくない場合に便利です。

4

あなたは明示的に再度itertools.productに供給できる2つのリストが含まれますitertools.product

import itertools 
a = ['a', 'b'] 
b = [1, 2, 3] 
pairs = [list(itertools.product([ai], b)) for ai in a] 

pairsで再びそれらのペアで動作し、itertools.productを使用して、あなたのペアごとのアイテムを作成することができます。

list(itertools.product(*pairs)) 

結果は次のとおりです。

[(('a', 1), ('b', 1)), 
(('a', 1), ('b', 2)), 
(('a', 1), ('b', 3)), 
(('a', 2), ('b', 1)), 
(('a', 2), ('b', 2)), 
(('a', 2), ('b', 3)), 
(('a', 3), ('b', 1)), 
(('a', 3), ('b', 2)), 
(('a', 3), ('b', 3))]