Pythonのzip関数の使い方(複数の要素をまとめて取得する)

Pythonのzip関数の基本的な使い方を解説します。

Pythonのzip関数の使い方(複数の要素をまとめて取得する)

Pythonのzip()関数は組み込み関数のひとつで、リストやタプルなどのイテラブルが複数ある場合に、それぞれの要素をまとめて返す関数です。for文などで、複数のリストから一つずつ要素を取り出して使用する場合などに使います。

この記事ではzip()関数の基本的な使い方について解説します。

zip関数の基本的な使い方

zip()関数は、リストやタプルなどのイテラブルなオブジェクトを、二つ以上引数に取って使用します

for文の中でzip()関数を使うと、ループごとにそれぞれのイテラブルから要素を一つずつ取り出すことができます。

# zip関数の基本的な使い方

ja = ["りんご", "ごりら", "らっぱ"]
en = ["Apple", "Gorilla", "Trumpet"]

for j, e in zip(ja, en):
    print(f"日本語:{j} <-> 英語:{e}")

# 日本語:りんご <-> 英語:Apple
# 日本語:ごりら <-> 英語:Gorilla
# 日本語:らっぱ <-> 英語:Trumpet


# 3つ以上を展開することも可能
fr = ["Pomme", "Gorille", "Trompette"]

for j, e, f in zip(ja, en, fr):
    print(f"日本語:{j} <-> 英語:{e} <-> フランス語:{f}")

# 日本語:りんご <-> 英語:Apple <-> フランス語:Pomme
# 日本語:ごりら <-> 英語:Gorilla <-> フランス語:Gorille
# 日本語:らっぱ <-> 英語:Trumpet <-> フランス語:Trompette

zip()関数は、複数のイテラブルオブジェクトの要素をタプルでまとめたものを返すイテレータを返します。for文以外でも、各要素をまとめてリストとして扱いたい場合などは便利です。

# zip関数はイテレータを返す

ja = ["りんご", "ごりら", "らっぱ"]
en = ["Apple", "Gorilla", "Trumpet"]

zipped = zip(ja, en)
print(zipped)
# <zip object at 0x7fadc7f45cc0>

print(type(zipped))
# <class 'zip'>

# リスト化できる
l = list(zipped)
print(l)
# [('りんご', 'Apple'), ('ごりら', 'Gorilla'), ('らっぱ', 'Trumpet')]

引数に渡したリストの要素数が異なる場合

zip()関数の引数に渡したリスト・タプルの要素数が異なる場合には、要素数が少ない方に合わせて戻り値が返されます

# 要素数が異なる場合

# 要素数が少ない方に合わせて戻り値を返す
ja = ["りんご", "ごりら"]
en = ["Apple", "Gorilla", "Trumpet"]

for j, e in zip(ja, en):
    print(f"日本語:{j} <-> 英語:{e}")

# 日本語:りんご <-> 英語:Apple
# 日本語:ごりら <-> 英語:Gorilla

要素数が異なる場合にエラーを出す(strict=True)

要素数が異なる場合にはエラーを出したい場合、zip()関数にstrict=Trueを設定しましょう。strict引数はPython 3.10で追加された機能で、Python 3.9以前では使えないことに注意してください。

# 要素数が異なる場合にエラーを出す

# strict=Trueを設定する
ja = ["りんご", "ごりら"]
en = ["Apple", "Gorilla", "Trumpet"]

for j, e in zip(ja, en, strict=True):
    print(f"日本語:{j} <-> 英語:{e}")

# 日本語:りんご <-> 英語:Apple
# 日本語:ごりら <-> 英語:Gorilla
# ValueError: zip() argument 1 is shorter than argument 2

zip()関数のデフォルトの設定はstrict=Falseなので、何も指定しなければこれまで通り、少ない方の要素数に合わせて戻り値が返されます。

要素数が異なる場合に指定の要素で埋める(itertools.zip_longest)

zip()関数の引数に渡したリスト・タプルの要素数が異なる場合に、エラーを出したり要素数が少ない方に合わせるのではなく、要素数が多い方に合わせて足りない要素を埋める方法もあります

Pythonの標準ライブラリのitertoolsモジュールのzip_longest()関数を使います。使い方はzip()関数と同様です。

埋め合わせる要素はfillvalue引数で指定します。指定しない場合にはNoneで埋められます。

# 足りない要素数を指定の要素で埋める

from itertools import zip_longest

ja = ["りんご", "ごりら"]
en = ["Apple", "Gorilla", "Trumpet"]

for j, e in zip_longest(ja, en):
    print(f"日本語:{j} <-> 英語:{e}")

# 日本語:りんご <-> 英語:Apple
# 日本語:ごりら <-> 英語:Gorilla
# 日本語:None <-> 英語:Trumpet


# fillvalue引数で、埋め合わせる要素を指定する
for j, e in zip_longest(ja, en, fillvalue="わかりません"):
    print(f"日本語:{j} <-> 英語:{e}")

# 日本語:りんご <-> 英語:Apple
# 日本語:ごりら <-> 英語:Gorilla
# 日本語:わかりません <-> 英語:Trumpet