今回は、Pythonのビルトイン関数である zip()
の使い方を検証します。
zip()関数は、複数のシーケンスから対応する要素を1つのタプルのリストにまとめることができる Python のビルトイン関数です。シーケンスとは、
zip()` 関数が受け付ける引数のことである。シーケンスはいくつでも与えることができますが、最も一般的なユースケースは、2つのシーケンスに含まれる対応する要素を結合することです。
例えば、以下の2つのリストがあるとします。
>>> vehicles = ['unicycle', 'motorcycle', 'plane', 'car', 'truck']
>>> wheels = [1, 2, 3, 4, 18]
zip()` 関数を用いて、この2つのリストの要素を順序に基づいて関連付けることができます。
>>> list(zip(vehicles, wheels))
[('unicycle', 1), ('motorcycle', 2), ('plane', 3), ('car', 4), ('truck', 18)]
出力はタプルのシーケンスであり、各タプルは入力シーケンスの要素を対応するインデックスで結合していることに注意してください。
注意すべき重要な点として、入力シーケンスの長さが異なる場合、 zip()
は最も短いリストの末尾に到達するまでしか要素をマッチさせないということがあります。例えば
>>> vehicles = ['unicycle', 'motorcycle', 'plane', 'car', 'truck']
>>> wheels = [1, 2, 3]
>>> list(zip(vehicles, wheels))
[('unicycle', 1), ('motorcycle', 2), ('plane', 3)]
この例では、wheels
のリストの方が短いので (vehicles
が持つ 5 つのアイテムに対して 3 つのアイテム)、シーケンスは “plane” で停止しています。
先に述べたように、 zip()
関数は 2 つ以上のシーケンスで使用することができます。
>>> vehicles = ['unicycle', 'motorcycle', 'plane', 'car', 'truck']
>>> wheels = [1, 2, 3, 4, 18]
>>> energy_sources = ['pedal', 'gasoline', 'jet fuel', 'gasoline', 'diesel']
>>> list(zip(vehicles, wheels, energy_sources))
[('unicycle', 1, 'pedal'), ('motorcycle', 2, 'gasoline'), ('plane', 3, 'jet fuel'), ('car', 4, 'gasoline'), ('truck', 18, 'diesel')]
このように複数のシーケンスを接続する理由の1つは、複数のシーケンス内のアイテムをよりきれいに反復処理する方法を作成するためです。zip()` 関数がなければ、次のようなことをしなければならないでしょう。
>>> for i in range(len(vehicles)):
... print('A ' + vehicles[i] + ' has ' + str(wheels[i]) + ' wheels and runs on ' + energy_sources[i])
...
A unicycle has 1 wheels and runs on pedal
A motorcycle has 2 wheels and runs on gasoline
A plane has 3 wheels and runs on jet fuel
A car has 4 wheels and runs on gasoline
A truck has 18 wheels and runs on diesel
しかし、zip()
関数を使えば、タプルのアンパッキングによって以下のようなきれいな構文が使えるようになります。
>>> for v, w, es in zip(vehicles, wheels, energy_sources):
... print('A ' + v + ' has ' + str(w) + ' wheels and runs on ' + es)
...
A unicycle has 1 wheels and runs on pedal
A motorcycle has 2 wheels and runs on gasoline
A plane has 3 wheels and runs on jet fuel
A car has 4 wheels and runs on gasoline
A truck has 18 wheels and runs on diesel
zip()関数について理解しておくべき最後のことは、この関数は実際にはタプルのリストではなく、イテレータを返すということです。上の最初の 2 つの例では、結果をリストに変換するために
zip()関数を
list()型でラップしていることに注意してください。もし、
zip()` 関数の戻り値を直接表示しようとすると、次のようなものが表示されます。
>>> zip(vehicles, wheels)
<zip 0x1032caf48="" at="" object=""
この ‘zip オブジェクト’ は Zip
クラスの反復可能なインスタンスです。つまり、リストのように一度にすべてを返すのではなく、for ループでひとつひとつ内容を返していきます。これは、一度にアクセスすると非常に多くのメモリを消費するような大きなシーケンスに対して、より効率的な方法です。
著者について
この記事は、コードを通じて人々の生活を向上させることに情熱を注ぐソフトウェアコンサルタント兼開発者、Jacob Stopakによって書かれました。Jacob は Initial Commit という、好奇心旺盛な開発者が自分の好きなプログラムがどのようにコーディングされているかを学ぶためのサイトの作者です。その注目のプロジェクトは、人々がコードレベルで Git を学ぶのを助けます。
</zip