zip()の使い方:複数のイテラブルをまとめる【Python】

pythonのzip()の記事アイキャッチPython

zip()の使い方

Pythonの組み込み関数としてzip()があります。
zipファイルとは関係なく、イテラブルを同時に回したい時に使います。

Pythonの公式ドキュメントにはこんな感じに書かれていました。

複数の反復可能オブジェクトを並行して反復し、それぞれのアイテムを含むタプルを生成します。(Google翻訳)

https://docs.python.org/ja/3/library/functions.html#zip

実際に動作を見てもらった方がわかりやすいと思うので、早速コードを見てみましょう。

name = ['John', 'Coner', 'William']
job = ['farmer', 'programmer', 'dentist']
for n, j in zip(name, job):
  print(f'name : {n} , job : {j}')

# name : John , job : farmer
# name : Coner , job : programmer
# name : William , job : dentist

各イテラブルの同じインデックスの要素が同時に取得できていることがわかりますね。

リスト化 or タプル化 or 辞書化

zip()を使うと返り値はzipオブジェクトなのでlistやtuple、辞書形式で欲しければそのまま変換してやればOKです。

つまり、list(),tuple(),dict()といった関数を使います。

name = ['John', 'Coner', 'William']
job = ['farmer', 'programmer', 'dentist']

zipped = zip(name, job)
# print(list(zipped))
# [('John', 'farmer'), ('Coner', 'programmer'), ('William', 'dentist')]
# print(tuple(zipped))
# (('John', 'farmer'), ('Coner', 'programmer'), ('William', 'dentist'))
# print(dict(zipped))
# {'John': 'farmer', 'Coner': 'programmer', 'William': 'dentist'}

最短に合わせるか最長に合わせるか

zip()を使うと以下のように引数に指定されたイテラブルオブジェクトのうち要素数が最小のものに合わせられてしまいます。

name = ['John']
job = ['farmer', 'programmer', 'dentist']

for n, j in zip(name, job):
  print(f'name : {n} , job : {j}')

# name : John , job : farmer

逆に最多のものに合わせたければitertools.zip_longest()を使えば良いです。

from itertools import zip_longest

name = ['John']
job = ['farmer', 'programmer', 'dentist']

for n, j in zip_longest(name, job):
  print(f'name : {n} , job : {j}')

# name : John , job : farmer
# name : None , job : programmer
# name : None , job : dentist

unzip:zip()したものを元に戻す

zip()したものを元に戻してくれるunzip()はPythonでは用意されていないので自分で実装する必要があるようです。

unzipは以下のようにして実装します。

zip(*zip(list1, list2, ···))

もっと詳しく知りたい方はこちらをご覧ください。

参考

組み込み関数
Python インタプリタには数多くの関数と型が組み込まれており、いつでも利用できます。それらをここにアルファベット順に挙げます。,,,, 組み込み関数,,, A, abs(), aiter(), all(), anext(), any(), ascii(),, B, bin(), bool(), breakpoint...

コメント