文法・環境 組み込み関数

【python】zip関数の使い方(複数のリストの要素をまとめて同時に処理)

pythonのzip関数の使い方について紹介します。

zip関数について基本的な使い方や注意点、応用例を解説します。

この記事で分かること

  • zip関数とは
  • zip関数の基本的な使い方
  • zip関数で、3つ以上のイテラブルを扱う場合の注意点
  • zip関数で、イテラブルの要素数が異なる場合の注意点
  • zip関数を用いて、1次元リストを2次元リストに変換【内包表記】
  • 2つのリストをzipでまとめて辞書型に変換する方法
  • zipとenumerateを組み合わせる場合の注意点

スポンサーリンク

zip関数とは

はじめに、zip関数について簡単に説明します。

zip関数は、pythonにあらかじめ用意されている組み込み関数です。

そのため、importせずに使用することができます。

zip関数は、イテラブルオブジェクト(リストやタプル等)の複数の要素をまとめ

新たなイテラブルオブジェクト(zipオブジェクト)を生成します。

zip関数は、forループで、複数のリストの対応する要素を同時に取得する際などによく使用されます

文章だとなかなかイメージが湧かないと思いますので、以降で実際にサンプルコードを見ながら動作を説明します。

zip関数の基本的な使い方

zip関数の基本的な使い方について、紹介します。

zip関数の引数には、イテラブルオブジェクト(リストやタプル等)を複数指定します。

zip関数の書き方

zipオブジェクト = zip( イテラブル, イテラブル, ・・・ )

サンプルコードで動作を確認してみましょう。

### zip関数のサンプルコード
names = ["sato", "suzuki", "takahashi", "tanaka", "watanabe"]
weights = [70, 60, 65, 80, 100]

zip_test = zip(names, weights)
print(zip_test)
# <zip object at 0x000001F27B68EAC8>
print(list(zip_test))
# [('sato', 70), ('suzuki', 60), ('takahashi', 65), ('tanaka', 80), ('watanabe', 100)]

>print(zip_test)

># <zip object at 0x000001F27B68EAC8>

zipオブジェクトが生成されていることが分かると思います。

このままでは要素が確認できないため、list関数でリスト型に変換しています。

>print(list(zip_test))

># [('sato', 70), ('suzuki', 60), ('takahashi', 65), ('tanaka', 80), ('watanabe', 100)]

リストの中に、タプルの形で要素が入っていることが分かると思います。

zip関数をforループで使用する

zip関数は、forループとともによく使用されます

zip関数を用いることで、forループ内で使用する要素を、複数のリストから同時に取得できます

以下、サンプルコードです。

### zip関数のサンプルコード
names = ["sato", "suzuki", "takahashi", "tanaka", "watanabe"]
weights = [70, 60, 65, 80, 100]

for name, weight in zip(names, weights):
    print(name, weight)
# sato 70
# suzuki 60
# takahashi 65
# tanaka 80
# watanabe 100

スポンサーリンク

zip関数で、3つ以上のイテラブルを扱う場合

zip関数は、3つ以上のイテラブルオブジェクトも扱うことができます

サンプルコードを見て頂ければ、すぐに理解できると思います。

### zip関数で3つ以上のリストを扱う
names = ["sato", "suzuki", "takahashi", "tanaka", "watanabe"]
weights = [70, 60, 65, 80, 100]
heights = [175, 165, 170, 180, 175]

for name, weight, height in zip(names, weights, heights):
    print(name, weight, height)
# sato 70 175
# suzuki 60 165
# takahashi 65 170
# tanaka 80 180
# watanabe 100 175

zip関数で、イテラブルの要素数が異なる場合

zip関数の引数に指定した、イテラブルの要素数が異なる場合は、少ない方の要素数にあわせて処理されます

以下のサンプルコードでは、namesの要素数が6、weightsの要素数が5であり、

イテラブルオブジェクトであるリストの要素数が異なっています。

### zip関数でリストの要素の数が異なる場合
names = ["sato", "suzuki", "takahashi", "tanaka", "watanabe", "nakamura"]
weights = [70, 60, 65, 80, 100]

for name, weight in zip(names, weights):
    print(name, weight)
# sato 70
# suzuki 60
# takahashi 65
# tanaka 80
# watanabe 100

zip関数でイテラブルの要素が異なる場合に、要素が多い方に合わせる

前述の例では、要素数の少ない方にあわせて処理されていました。

要素数の多い方に合わせて処理を行いたい場合は、

pythonの標準ライブラリであるitertoolsモジュールのzip_longest関数を使用します。

以下、サンプルコードです。

### zip_longest関数のサンプルコード
from itertools import zip_longest

names = ["sato", "suzuki", "takahashi", "tanaka", "watanabe", "nakamura"]
weights = [70, 60, 65, 80, 100]

for name, weight in zip_longest(names, weights):
    print(name, weight)
# sato 70
# suzuki 60
# takahashi 65
# tanaka 80
# watanabe 100
# nakamura None

要素が足りていない場合は、 「None」になります。

要素が足りない場合に、任意の値を入力したい場合は、

引数で「fillvalue」を指定します。

### zip_longest関数のサンプルコード
from itertools import zip_longest

names = ["sato", "suzuki", "takahashi", "tanaka", "watanabe", "nakamura"]
weights = [70, 60, 65, 80, 100]

for name, weight in zip_longest(names, weights, fillvalue="---"):
    print(name, weight)
# sato 70
# suzuki 60
# takahashi 65
# tanaka 80
# watanabe 100
# nakamura ---

スポンサーリンク

zip関数を用いて、1次元リストを2次元リストに変換【内包表記】

zip関数を用いると、1次元リストを2次元リストに変換することもできます。

はじめに、zip関数で複数のリストからzipオブジェクト生成した後に、

list関数で、リスト型に変形する例を紹介します。

### 1次元リストを2次元リストに変換
numbers = [0, 1, 2, 3]
fruits = ["Apple", "Banana", "Orange", "Mango"]
foods = ["Beef", "Pork", "Bread", "Rice"]

list_2d = list(zip(numbers, fruits, foods))
print(list_2d)
# [(0, 'Apple', 'Beef'), (1, 'Banana', 'Pork'), (2, 'Orange', 'Bread'), (3, 'Mango', 'Rice')]

この例だと、タプルがリストの要素になっています。

2重のリスト構造にしたい場合は、リスト内包表記で下記のようにします

### 1次元リストを2次元リストに変換
numbers = [0, 1, 2, 3]
fruits = ["Apple", "Banana", "Orange", "Mango"]
foods = ["Beef", "Pork", "Bread", "Rice"]

list_2d = [[num, fruit, food] for num, fruit, food in zip(numbers, fruits, foods)]
print(list_2d)
# [[0, 'Apple', 'Beef'], [1, 'Banana', 'Pork'], [2, 'Orange', 'Bread'], [3, 'Mango', 'Rice']]

なお、内包表記については、下記の記事で紹介しています。併せて参考にしてみてください。

2つのリストをzipでまとめて辞書型に変換

zip関数は、リスト型から辞書型へ変換する際に便利です。

zip関数で、keyとvalueにあたるリストをまとめ、そのzipオブジェクトをdict関数で辞書型に変換します。

以下、サンプルコードです。

### 2つのリストをzip関数を用いて辞書型に変換
numbers = [11, 22, 33, 44, 55]
names = ["sato", "suzuki", "takahashi", "tanaka", "watanabe"]

name_dict = dict(zip(numbers, names))
print(name_dict)
# {11: 'sato', 22: 'suzuki', 33: 'takahashi', 44: 'tanaka', 55: 'watanabe'}
print(name_dict[11])
# sato

スポンサーリンク

zipとenumerateを組み合わせる場合

enumerate関数は、イテラブルオブジェクトの要素とインデックスを同時に取得できます。

以下、サンプルコードです。

### enumerate関数のサンプルコード
names = ["sato", "suzuki", "takahashi", "tanaka", "watanabe"]

for i, name in enumerate(names):
    print(i, name)
# 0 sato
# 1 suzuki
# 2 takahashi
# 3 tanaka
# 4 watanabe

このenumerate関数を、zip関数と同時に使う場合は、特殊な書き方になるので注意が必要です。

### zip関数とenumerate関数を組み合わせる場合
names = ["sato", "suzuki", "takahashi", "tanaka", "watanabe"]
weights = [70, 60, 65, 80, 100]

for i, (name, weight) in enumerate(zip(names, weights)):
    print(i, name, weight)
# 0 sato 70
# 1 suzuki 60
# 2 takahashi 65
# 3 tanaka 80
# 4 watanabe 100

forで要素を取り出すときに、

zip関数でまとめた要素を (name, weight) のように括弧で囲む必要があります。

なお、zip関数とenumate関数を組合せた場合に、

zip関数でまとめた要素をタプルの形で受け取ることもできます。

### zip関数とenumerate関数を組み合わせる場合
names = ["sato", "suzuki", "takahashi", "tanaka", "watanabe"]
weights = [70, 60, 65, 80, 100]

for i, value_tuple in enumerate(zip(names, weights)):
    print(i, value_tuple)
# 0 ('sato', 70)
# 1 ('suzuki', 60)
# 2 ('takahashi', 65)
# 3 ('tanaka', 80)
# 4 ('watanabe', 100)

enumerate関数については、下記の記事で紹介しています。併せて参考にしてみてください。

スポンサーリンク

まとめ

pythonのzip関数の基本的な使い方について、紹介しました。

複数のリストを同時に処理したいときに、zip関数はとても便利ですので、基本的な使い方は覚えておくようにしましょう。

スポンサーリンク

スポンサーリンク

-文法・環境, 組み込み関数
-,