「名前のリストと点数のリスト、この2つを同時にループ処理したいんだけど、どう書けばいいんだろう?」Pythonを学び始めると、こんな場面に出会うことがありますよね。インデックス番号を使ってforループを回す方法もありますが、コードが少し読みにくくなりがちです。
そんなときに大活躍するのが、今回ご紹介するzip(ジップ)関数です。複数のリストをまるでジッパー(チャック)のようにかみ合わせて、1つにまとめてくれる便利な組み込み関数です。
この記事では、Pythonのzip関数について、基本的な使い方から、辞書への変換、要素数が異なる場合の挙動、そして元のリストに戻す「unzip」のテクニックまで、初心者の方にも分かりやすく丁寧に解説していきます。サンプルコードと実行結果を見ながら、一緒にマスターしていきましょう。
コンテンツ
zip関数とは?複数のリストをまとめる組み込み関数
zip関数は、複数のリストやタプルなどから要素を先頭から順番に1つずつ取り出し、それらをペア(組)にしてまとめてくれる組み込み関数です。名前のとおり、ジッパーで2つの列をかみ合わせて1本にするイメージを持つと分かりやすいですね。
zip関数を使うと、複数のリストを同時にループ処理できるため、for文をとてもすっきりと書けるようになります。なお、zipが取り出すペアはタプル(tuple)という形式になっている点も、あわせて覚えておきましょう。
基本的な書き方は次のとおりです。
for 変数1, 変数2 in zip(リスト1, リスト2):
# 処理zip関数の基本的な使い方
2つのリストを同時にループする
まずは、名前のリストと点数のリストを同時にループしてみましょう。
names = ["田中", "佐藤", "鈴木"]
scores = [85, 92, 78]
for name, score in zip(names, scores):
print(f"{name}さんの点数は{score}点です")
# 実行結果
# 田中さんの点数は85点です
# 佐藤さんの点数は92点です
# 鈴木さんの点数は78点ですzip(names, scores)とすることで、namesとscoresから同じ位置の要素がペアになって取り出されます。1回目のループではnameに「田中」、scoreに85が入る、という具合ですね。とても直感的に書けるのが分かると思います。
インデックスを使う方法と比べてみよう
もしzipを使わずに同じ処理を書くと、次のようにインデックス番号を使うことになります。
names = ["田中", "佐藤", "鈴木"]
scores = [85, 92, 78]
for i in range(len(names)):
print(f"{names[i]}さんの点数は{scores[i]}点です")この書き方でも動きますが、names[i]やscores[i]のように毎回インデックスを指定する必要があり、少し読みにくくなりますよね。zipを使えばインデックスを意識せずに済むため、コードがぐっとシンプルになります。range関数を使ったfor文の基本については、Pythonのfor文・range関数を攻略!の記事でくわしく解説しているので、あわせて読んでみてください。
3つ以上のリストもまとめられる
zip関数は2つだけでなく、3つ以上のリストを同時にまとめることもできます。
names = ["田中", "佐藤", "鈴木"]
scores = [85, 92, 78]
subjects = ["数学", "英語", "国語"]
for name, subject, score in zip(names, subjects, scores):
print(f"{name}さんの{subject}は{score}点です")
# 実行結果
# 田中さんの数学は85点です
# 佐藤さんの英語は92点です
# 鈴木さんの国語は78点ですリストの数だけ受け取る変数を増やせば、いくつでもまとめてループできます。とても柔軟ですね。
zip関数の結果をリストや辞書に変換する
zip関数が返すのは「zipオブジェクト」と呼ばれるイテレータで、そのままprintしても中身は表示されません。中身を確認したり再利用したりするには、list()やdict()で変換するのが基本です。
list()でリストに変換する
names = ["田中", "佐藤", "鈴木"]
scores = [85, 92, 78]
pairs = list(zip(names, scores))
print(pairs)
# 実行結果
# [("田中", 85), ("佐藤", 92), ("鈴木", 78)]list()で変換すると、ペアが1つずつタプルになったリストが得られます。こうしたペアのリストは、リスト内包表記と組み合わせて加工するのもおすすめです。
dict()で辞書を作る
名前をキー、点数を値にしたいときは、dict()を使うと一発で辞書が作れます。
names = ["田中", "佐藤", "鈴木"]
scores = [85, 92, 78]
score_dict = dict(zip(names, scores))
print(score_dict)
# 実行結果
# {"田中": 85, "佐藤": 92, "鈴木": 78}2つのリストから辞書を作りたい場面はとても多いので、この書き方は覚えておくと便利です。作った辞書の操作方法については辞書(dict)の使い方を徹底解説の記事も参考にしてください。
要素数が違うとどうなる?
zipに渡すリストの要素数がそろっていない場合は、一番短いリストに合わせてループが止まります。
names = ["田中", "佐藤", "鈴木"]
scores = [85, 92] # 2つしかない
for name, score in zip(names, scores):
print(name, score)
# 実行結果
# 田中 85
# 佐藤 92
# (鈴木は対応する点数がないため無視される)「鈴木」さんは対応する点数がないため、ループの対象になりません。エラーにはならず静かに切り捨てられるので、要素数がずれていないか注意しましょう。なお、短い方に合わせず長い方に合わせたいときは、標準ライブラリのitertools.zip_longestを使う方法もあります。
zip(*)で元のリストに戻す(unzip)
ペアになったリストを、もう一度それぞれのリストに分解したいときは、アスタリスク(*)を付けてzip(*)とします。いわゆる「unzip(アンジップ)」です。
pairs = [("田中", 85), ("佐藤", 92), ("鈴木", 78)]
names, scores = zip(*pairs)
print(names) # ("田中", "佐藤", "鈴木")
print(scores) # (85, 92, 78)zip(*pairs)とすることで、各ペアの1番目どうし・2番目どうしがまとめ直されます。返ってくるのはリストではなくタプルになる点に注意してください。リストにしたい場合はlist()で包んであげましょう。
zip関数を使うときの注意点
- zipオブジェクトはイテレータなので、一度for文で回すと中身が消費され、2回目は空になります。
- 繰り返し使いたいときは、list()でリストに変換してから保存しておきましょう。
- 要素数が異なるリストを渡すと、もっとも短いリストに合わせて切り捨てられます。
- 取り出されるペアはタプルなので、値を書き換えたい場合はリストに変換する必要があります。
※本記事には広告(アフィリエイトリンク)を含みます。
もっと効率的にPythonを学びたい人へ
zip関数のように、Pythonには知っているだけでコードがぐっと書きやすくなる機能がたくさんあります。とはいえ、独学だと「これで合っているのかな?」と不安になったり、エラーの原因が分からず手が止まってしまったりすることもありますよね。
そんなときは、プロの講師にマンツーマンで教えてもらえるプログラミングスクールを活用するのも一つの手です。下記の「Python Winner」は、未経験からのPython習得や転職サポートに対応しており、まずは無料カウンセリングで学習プランを相談できます。本気でエンジニアを目指したい方は、選択肢として検討してみてはいかがでしょうか。
Pythonプログラミング|マンツーマンレッスンで初めてをプロに育てる【Python Winner】![]()
まとめ
今回は、Pythonのzip関数の使い方について解説しました。最後に要点を振り返っておきましょう。
- zip関数は複数のリストの要素をペアにまとめ、同時にループ処理できる組み込み関数。
- for name, score in zip(names, scores): のように書くと、インデックスを使わずスッキリ書ける。
- 3つ以上のリストもまとめられる。
- list()でタプルのリストに、dict()で辞書に変換できる。
- 要素数が違う場合は、一番短いリストに合わせて切り捨てられる。
- zip(*pairs)で元のリストに分解(unzip)できる(返り値はタプル)。
- zipオブジェクトはイテレータなので、繰り返し使うならlist()で保存する。
zip関数を使いこなせると、複数のデータをまとめて扱う処理がとても書きやすくなります。ぜひ実際に手を動かして試してみてくださいね。最後までお読みいただき、ありがとうございました。
ナノトイラボ 