複数のリストを同時に処理しようとして、「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つずつ要素を取り出して、それらをまとめてくれます。
先ほどの例で考えてみましょう。
itemsリストの1番目の要素「りんご」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コードに取り入れて、もっと効率的に開発を進めてくださいね!

コメント