2017-05-26 17 views
0

itertools.product()と一緒にどのように展開しているか(*)を以下の例でどのように扱っているか、私の頭の中ではわかりません。itertools.productでリストを解凍する際の説明

for x in product(["ghi","abc"]): 
    print(x) 

出力:

('ghi',) 
('abc',) 

と*使用して

for x in product(*["ghi","abc"]): 
    print(x) 

出力:

('g', 'a') 
('g', 'b') 
('g', 'c') 
('h', 'a') 
('h', 'b') 
('h', 'c') 
('i', 'a') 
('i', 'b') 
('i', 'c') 

がどのようにこの出力が生成されましたか?私はproduct()が通常 'repeat'の数を指定して組み合わせを生成することを知っています。上記のように、repeatは1にデフォルト設定されています。( 'a'、 'g')はどのように生成されませんでしたか?

*["ghi","abc"]は実際にproduct()の機能に何をもたらしたのでしょうか?私は結果が何であるかを見ることを意味するが、私はちょうどそれが働く方法を得るように思わない。

答えて

2

引数をproductにアンパックすると、リストの各要素を引数として手動で入力するのと同じになります。それは次のとおりです。

product(*[a, b]) == product(a, b)

だから何あなたが本当にproduct()にリスト内の各文字列を渡してやって。 Pythonは単にあなたのためにこれをバックグラウンドでやっています。

結果には('a', 'g')という理由が表示されませんでした。なぜなら、製品の仕組みのためです。 :

入力iterablesのデカルト積。

ジェネレータ式のネストされたfor-loopsとほぼ同じです。たとえば、product(A, B)は、((x,y) for x in A for y in B)と同じものを返します。

オイストメー​​ターのようにネストされたループサイクルは、反復ごとに右端の要素が前進します。このパターンは、辞書の順序を作成します。そのため、入力のiterablesがソートされると、プロダクト・タプルはソートされた順序で出力されます。

iterableの製品をそれ自身で計算するには、オプションのrepeatキーワード引数を指定して、繰り返し回数を指定します。例えば、product(A, repeat=4)は、product(A, A, A, A)と同じ意味です。

def product(*args, repeat=1): 
    # product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy 
    # product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111 
    pools = [tuple(pool) for pool in args] * repeat 
    result = [[]] 
    for pool in pools: 
     result = [x+[y] for x in result for y in pool] 
    for prod in result: 
     yield tuple(prod) 
+0

あなたが提供する説明と製品の仕事は本当に便利だったかの抜粋:実際の実装は、メモリ内の中間結果を構築していないことを除いて

この関数は、以下のコードとほぼ同等です。私は当初、作業の大半が開梱作業であると思っていましたが、製品機能の中でそのすべてを明らかにしました。ありがとう。 – user1179317

+0

@ user1179317喜んで私は助けます:-) –

関連する問題