0

プログラムのこの部分は何をしますか ( Nubela のガットハブにあります)?

def product(*args, **kwds):
    """
    for py2.6< support (they lack itertools lib)
    - http://docs.python.org/2/library/itertools.html#itertools.permutations
    """
    pools = map(tuple, args) * kwds.get('repeat', 1)
    result = [[]]
    for pool in pools:
        result = [x+[y] for x in result for y in pool]
    for prod in result:
        yield tuple(prod)

そして、プログラムの後半で:

list(set((product(*[range(2) for _ in range(length)]))))
4

1 に答える 1

1

itertools.product下位互換性のために実装されています。のドキュメントを参照してくださいproduct

itertools.product(*iterables[, 繰り返し])

入力イテラブルのデカルト積。

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

ネストされたループは走行距離計のように循環し、反復ごとに右端の要素が進みます。このパターンは、入力の iterable がソートされている場合、積のタプルがソートされた順序で発行されるように、辞書式の順序付けを作成します。

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

この関数は、実際の実装がメモリ内に中間結果を構築しないことを除いて、次のコードと同等です。

def product(*args, **kwds):
    # 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 = map(tuple, args) * kwds.get('repeat', 1)
    result = [[]]
    for pool in pools:
        result = [x+[y] for x in result for y in pool]
    for prod in result:
        yield tuple(prod)

ドキュメント内のコードが、見つけたものとどのように一致するかに注目してください。

itertools.permutations彼らがドキュメントに...コードへの参照を入れた理由がわかりません:

list(set((product(*[range(2) for _ in range(length)]))))

私の知る限り、それは次と同等です:

list(product(*[range(2) for _ in range(length)]))

イテラブルの積を単純に計算しますlength range(2)

于 2013-03-23T16:49:08.883 に答える