今川館

都内勤務の地味OLです

何段にも深くなるループを絶対に一段で書く方法

ループの中でループを回す処理は読みにくい

例えば友達が5人いて、サンドイッチが3種類あって、2種類の飲み物を配る処理を作るとします。
こういう場合、for文を何段にもネストするプログラムを書かざるを得ないときがありますよね。

for friend in friends:
    for sandwich in sandwiches:
        for drink in drinks:
            do_something(friend, sandwich, drink)

そもそも、こういうプログラムを書く前は、本当にそういう処理で正しいのか考えた方がいいですが、とにかくこんなコードは読みにくいです。
ループの中でループを回すプログラムを字下げして書くことが読みにくさに寄与していると思うのですが、pythonだと字下げは必須なので悩ましいものです。

itertools.productを使えば絶対に1段で書ける

しかし、こういう場合にfor文を絶対に1段で書ける方法があることにこの間気づきました。
itertools.productを使うとそれができます。

itertools.productは総当たりループの関数ですが、ここで取り上げたケースもよく考えれば総当たりループなので、こんな風に書き換えられます。

import itertools

for friend, sandwich, drink in itertools.product(friends, sandwiches, drinks):
    do_something(friend, sandwich, drink)

ループの順番とかパフォーマンスとかを気にする場合は使えませんが、場合によっては読みやすくなるんじゃないかと思ってちょっとブログに書いてみました。