【Python】複数のリストを同時にループ処理する

複数のリストを同時に処理しようとして、「for i in range(len(リスト1)):」と書いて、リスト1[i]リスト2[i]…って毎回インデックス指定していませんか?

さらに、たまにリストの長さが違って「IndexError」が出たり、コードがなんだか長くなって読みにくかったり…

あー、それ面倒ですよね!私も昔、同じところで何度も詰みました!

でも安心してください。Pythonには、この悩みを一瞬で解決してくれる、とっても便利な「zip関数」というものがあります。

今回は、このzip関数を使って、複数のリストを同時に、しかもスマートにループ処理するテクニックを、コピペで使えるコード付きで分かりやすく解説します!これを読めば、あなたのコードはもっとスッキリ、もっと堅牢になりますよ!


よくある「困った」例

まず、あなたが今、どんなことに困っているか、具体的なコードで見てみましょう。
例えば、商品の名前と価格をそれぞれ別のリストに持っていて、それらを組み合わせて表示したい場合を考えます。

“`python

商品の名前リスト

items = [“りんご”, “バナナ”, “みかん”]

商品の価格リスト

prices = [100, 200, 150]

print(“— 困ったコードの例 —“)

困ったコードの例:インデックスを使ってループ

for i in range(len(items)):
# それぞれのリストからi番目の要素を取り出す
print(f”{items[i]}は{prices[i]}円です。”)

もしリストの長さが違ったら…

items = [“りんご”, “バナナ”, “みかん”, “ぶどう”]

prices = [100, 200, 150]

この場合、ぶどうの価格を取り出そうとしたときに「IndexError」が発生します!

“`

このコードでも動きますが、[i]を何度も書くのは手間ですし、何より「リストの長さが違うとエラーになる」というリスクが常に付きまといます。初心者の方にとっては、このエラーの原因特定も一苦労ですよね。


【解決策】zip関数でスッキリ!コピペで使える魔法のコード

それでは、本題のzip関数を使った解決策です。
先ほどのコードが、たったこれだけで驚くほどスッキリします。

“`python

商品の名前リスト

items = [“りんご”, “バナナ”, “みかん”]

商品の価格リスト

prices = [100, 200, 150]

print(“\n— zip関数を使った解決コード —“)

zip関数を使って、2つのリストを同時にループ処理

for item, price in zip(items, prices):
print(f”{item}は{price}円です。”)
“`

どうでしょうか?
range(len(items))のような記述もなくなり、[i]も消えて、コードがすごく読みやすくなったと思いませんか?

このコードをそのままコピペして、あなたのリスト名に書き換えれば、すぐに使えます!


zip関数って何をしているの?(専門用語は優しく解説)

zip関数は、複数のリストを「同じ位置の要素同士でペアにする」という働きをします。

例えるなら、洋服の「ファスナー(チャック)」のようなものです。左右の布をジッパーがスライドしながらくっつけていくように、zip関数も複数のリストから1つずつ要素を取り出して、それらをまとめてくれます。

先ほどの例で考えてみましょう。

  1. itemsリストの1番目の要素「りんご」
  2. pricesリストの1番目の要素「100」

zip関数はこれらを「りんご」と「100」というペア(正確には「タプル」というデータの塊)にしてくれます。そして、次のループでは「バナナ」と「200」のペア、その次は「みかん」と「150」のペア、という具合に順々に生成していきます。

ちょっと専門用語:タプルとアンパック

「ペア」と説明しましたが、Pythonではこれを「タプル」と呼びます。タプルは、複数の値をひとまとめにしたもので、()で囲まれて表現されます。

例えば、list(zip(items, prices))とすると、以下のようなタプルのリストが作られているイメージです。

“`python
items = [“りんご”, “バナナ”, “みかん”]
prices = [100, 200, 150]

print(list(zip(items, prices)))

出力: [(‘りんご’, 100), (‘バナナ’, 200), (‘みかん’, 150)]

“`

そして、for item, price in zip(items, prices):という部分ですが、これはzip関数が作ってくれたペア(タプル)から、一つ目の値をitemに、二つ目の値をpriceに、というように自動で取り出す処理をしています。これを「アンパック」と呼びます。

難しく考えなくても大丈夫です!
要は、zip関数がリストの要素をまとめてくれて、for文でそれぞれの変数にポンッと入れてくれる、と理解しておけばOKです。


【ちょっと応用】リストの長さが違っても大丈夫?

先ほど「range(len(...))だとリストの長さが違うとエラーになる」という話をしました。
では、zip関数を使った場合はどうなるのでしょうか?

zip関数は、一番短いリストの長さに合わせて処理を止めます。エラーにはなりませんが、短い方に合わせるという特性を理解しておくことが重要です。

例を見てみましょう。

“`python
names = [“Alice”, “Bob”, “Charlie”, “David”]
scores = [85, 92, 78] # Davidさんのスコアが足りません…

print(“\n— リストの長さが違う場合のzip関数 —“)
for name, score in zip(names, scores):
print(f”{name}さんのスコアは{score}点です。”)

出力:

Aliceさんのスコアは85点です。

Bobさんのスコアは92点です。

Charlieさんのスコアは78点です。

“`

このように、scoresリストが3つの要素しかないので、Davidさんの情報は処理されずにループが終了しています。エラーで止まるよりは良いですが、「あれ?全部処理されてない!」と慌てないように、この挙動は覚えておいてくださいね。

もし、どうしても長いリストに合わせて処理したい(足りない分は「なし」などとして扱いたい)場合は、itertools.zip_longestという別の関数を使いますが、まずは基本的なzip関数をマスターするのがおすすめです!


まとめ:Pythonでもっと楽になろう!

お疲れ様でした!
今回は、Pythonで複数のリストを同時にループ処理する際に便利なzip関数について解説しました。

  • range(len(...))[i]を組み合わせる面倒なコードから解放される!
  • zip関数を使うと、コードがシンプルになり、読みやすくなる。
  • リストの長さが違ってもIndexErrorで止まらない(短い方に合わせてくれる)。

たった数行のコードでも、こういった便利な関数を知っているかどうかで、書くスピードも、コードの品質も、そしてあなたの開発体験も大きく変わってきます。

コピペで解決できた!と感じていただけたら嬉しいです。ぜひ、あなたのPythonコードに取り入れて、もっと効率的に開発を進めてくださいね!

コメント

タイトルとURLをコピーしました