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