以前、enumerate関数の記事で、リストの要素と番号を同時に取得する方法を学習しました。今回は、1つのリストだけでなく『2つ以上の別々のリストから、同時にデータを取り出してまとめたい』場面で非常に役立つ「zip(ジップ)関数」について解説します。

zip関数を使用する

Pythonでzip関数を使うには、forとinの間に複数の変数をカンマ区切りで書き、inの後ろにzip(リスト1, リスト2)を記述します。
なので例としてzip関数は

for 変数1, 変数2 in zip(リスト1, リスト2):
    実行したい処理

の形式で記述します。この例ではインデントは半角スペース四つで行っています。
統一しているならインデントは半角スペース二つなどでも構いません。

具体的には次のような順番で処理が行われます。

  • zip関数が実行されると、まず括弧の中に指定された2つのリストから、それぞれ1番目のデータが同時に取り出されます。
  • そして、取り出されたデータがペアとなり、左側の「変数1」と右側の「変数2」にそれぞれ同時に代入され、その下のループ内の処理が実行されます。
  • 次に2番目のデータ同士が取り出されてペアになり…というように、リストの最後まで同じ位置(インデックス)にあるデータ同士を結びつけて処理を繰り返します。

これを活用することで、インデックス番号を使った複雑な処理を書かなくても、複数のリストを並行して綺麗に処理できるようになります。

では、実際にやってみましょう。
Google Colaboratory (Colab) を開いて新しいノートブックを作成し、名前のリストと点数のリストを同時に取り出して表示する基本的なプログラムを書いてみます。

# 名前のリストと点数のリストを用意する
names = ["Alex", "Bob", "Corrin"]
scores = [90, 80, 70]

# zip関数で2つのリストの要素を同時に取得する
for name, score in zip(names, scores):
  print(f"{name}さんの点数は{score}点です。")

とセルに入力して実行してみましょう。すると結果は

Alexさんの点数は90点です。
Bobさんの点数は80点です。
Corrinさんの点数は70点です。

のように表示されます。

プログラムの解説(基本的なzip関数)

  • リストの準備(2~3行目): 変数namesに名前のリストを、変数scoresに点数のリストをそれぞれ用意しています。
  • zip関数の実行(6行目): for name, score in zip(names, scores): と記述しています。zip()関数が2つのリストから1番目の要素(「Alex」と「90」)をペアにして取り出し、それぞれ変数namescoreに代入します。
  • 結果の表示(7行目): 取り出したデータを使ってprint関数で文章を表示しています。これがリストの最後まで順番に繰り返されます。

3つ以上のリストをまとめる・要素数が違う場合

zip関数は2つのリストだけでなく、括弧の中にカンマ区切りで追加していくことで、3つ、4つと複数のリストを同時にまとめることができます。

for 変数1, 変数2, 変数3 in zip(リスト1, リスト2, リスト3):
    実行したい処理

ここで一つ重要な性質があります。
それは「リストの長さ(データの数)が違う場合」の動きです。もしリストのデータ数がバラバラだった場合、zip関数は「一番短いリストの長さに合わせて処理を自動的に終了する」という仕組みになっています。
そのため、どれか一つのリストのデータが尽きた時点でループが止まり、余ったデータはエラーになることなく無視されます。

では、実際にやってみましょう。
Colabの新しいセルに、長さの違う3つのリスト(名前、年齢、出身地)をまとめるプログラムを書いてみます。

# 長さの違う3つのリストを用意する
names = ["Alex", "Bob", "Corrin", "David", "Eve"] # 5
ages = [20, 40, 30] # 3
cities = ["Hokkaido", "Tokyo", "Kyoto", "Okinawa"] # 4

# 3つのリストをzip関数でまとめる
for name, age, city in zip(names, ages, cities):
  print(f"{name}さんは{age}歳で、{city}出身です。")

とセルに入力して実行してみましょう。すると結果は

Alexさんは20歳で、Hokkaido出身です。
Bobさんは40歳で、Tokyo出身です。
Corrinさんは30歳で、Kyoto出身です。

のように表示されます。

プログラムの解説(3つ以上のリストと要素数の違い)

  • リストの準備(2~4行目): 要素数がそれぞれ5つ、3つ、4つとバラバラな3種類のリストを用意しています。
  • zip関数の実行(7行目): for name, age, city in zip(names, ages, cities): と記述し、3つのリストのデータを同時に取り出す準備をしています。
  • 短いリストに合わせた終了(8行目): 結果を見ると、3回しかprint関数が実行されていません。これは一番短いages リストのデータ(3つ)が尽きた時点でzip関数が処理を終了させたためです。「David」や「Okinawa」といった余ったデータはエラーを起こすことなく無視され、プログラムが完了しています。

リスト以外のデータ(文字列やタプル)をまとめる

ここまではリスト同士をまとめる例を紹介してきましたが、zip関数はリスト専用ではありません。文字列や以前学習したタプルなど、複数の要素が連なっているデータ(イテラブルと呼びます)であれば、種類が違っても組み合わせてまとめることができます。

例えば、「文字列」と「リスト」を同時に取り出すことも可能です。

では、実際にやってみましょう。
Colabの新しいセルに、文字列とリストをzip関数でまとめるプログラムを書いてみます。

# 文字列とリストを用意する
chars = "ABC"
numbers = [1, 2, 3]

# 文字列とリストをzip関数でまとめる
for char, num in zip(chars, numbers):
  print(f"文字は「{char}」、数字は「{num}」です。")

とセルに入力して実行してみましょう。すると結果は

文字は「A」、数字は「1」です。
文字は「B」、数字は「2」です。
文字は「C」、数字は「3」です。

のように表示されます。

プログラムの解説(リスト以外の利用)

  • データの準備(2~3行目): 変数chars には "ABC" という文字列を、変数numbers には[1, 2, 3]というリストを用意しています。
  • zip関数の実行(6行目): for char, num in zip(chars, numbers): と記述しています。文字列"ABC"は「A」「B」「C」という3つの文字の集まりとして扱われるため、リストの要素[1, 2, 3]と順番にペアにすることができます。
  • 結果の表示(7行目): 取り出したペアを print 関数で表示しています。このように、データ型が違っていても、要素が複数連なっているものであればzip関数で柔軟にまとめることができます。

まとめ

今回は、複数のリストから同時にデータを取り出す「zip関数」について解説しました。

  • zip関数とは: 複数のリストから同じ位置(インデックス)にあるデータをペアにして、同時に取り出すことができる機能。
  • 書き方のルール: for 変数1, 変数2 in zip(リスト1, リスト2): の形式で記述し、リストの数だけ変数を用意して受け取る。
  • 3つ以上のリスト: カンマで区切ることで、3つ以上のリストも同時にまとめることが可能。
  • 要素数が違う場合: 最も要素数が少ない(短い)リストに合わせてループが終了し、余った要素はエラーにならずに無視される。
  • リスト以外のデータ: 文字列やタプルなど、複数の要素を持つデータであれば、種類が違っても組み合わせることが可能。

別々のリストに分かれている関連データを処理する際に非常に便利な機能ですので、ぜひ試してみてください。

open-in-colab

今回はこれで終了です。
今回のサンプルを用意したので、もし必要な場合は上の「Open in Colab」と書いてあるボタンをクリックしてください。なおそのままだと編集不可なので編集をしたい場合は「ドライブにコピー」をクリックしてコピーしてください。
なおGoogle ColaboratoryについてわからなかったらGoogleColaboratoryを使ってみよう_導入編をご覧ください。

コメントを残す

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

CAPTCHA