Pythonのitertools.productは、複数のイテラブルの直積(Cartesian product)を生成する便利な関数です。しかし、この直積の長さを事前に知りたい場合はどうすればよいでしょうか?

例えば、以下のようなコードがあるとします。

import itertools

x = [0, 1]
y = [100, 200, 300]
myprod = itertools.product(x, y)

for p in myprod:
    print(p[0], p[1])

このコードは、xyの直積を生成し、各組み合わせを出力します。しかし、この直積の長さ(この場合は6)を事前に知りたい場合はどうすればよいでしょうか?

一つの方法は、直積をリストに変換し、その長さを取得することです。しかし、これはイテレータを消費してしまうため、後続のforループで使用することができません。

mylength = len(list(myprod))  # これはイテレータを消費する

代わりに、以下のように各イテラブルの長さを掛け合わせることで、直積の長さを計算することができます。

import functools
import operator

iters = [x, y]
length = functools.reduce(operator.mul, map(len, iters), 1)
print(length)  # 6

この方法ならば、イテレータを消費することなく直積の長さを取得することができます。ただし、この方法はソースイテラブルがシーケンス(つまり、長さを持つ)である場合にのみ機能します。

以上、Pythonのitertools.productの長さを取得する方法について解説しました。この情報がPythonでのプログラミングに役立つことを願っています。

投稿者 admin

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です