Python 反復処理 #5 zip

株式会社リュディアです。今回は zip を使った複数のイテラブルなオブジェクトを使った反復処理についてまとめてみます。zip_longest についても紹介します。

前回までの反復処理のまとめへのリンクは以下を参考にしてください。

zip という英単語自体の意味はジッパー(ファスナー)で締める、留めるという意味からきているのだと思います。Windows で使う圧縮ソフトの zip とは関係ないのでご注意ください。

では簡単な例から見ていきましょう。次の例を見てください。

l_a = ['Apple', 'Orange', 'Banana']
l_b = ['Beef', 'Chicken', 'Poke']

for fruit, meat in zip(l_a, l_b):
    print(fruit, meat)

>> Apple Beef
>> Orange Chicken
>> Banana Poke

2 つのリストに対して 1 つの for 文で処理をしていることがわかりますね。例えば zip を使わないで記述するとどうなるでしょうか? いろいろな書き方ができると思うのですが以下のような書き方になると思います。

l_a = ['Apple', 'Orange', 'Banana']
l_b = ['Beef', 'Chicken', 'Poke']

for i in range(len(l_a)):
    print(l_a[i], l_b[i])

>> Apple Beef
>> Orange Chicken
>> Banana Poke

行数は特に変わらないのですが、何を扱っているのかわかりにくくないですかね?私は zip を使って記述の方が可読性が高いと感じます。

では、次に要素数が異なる 2 つのリストを扱うとどのようになるでしょうか?次の例を見てください。

l_a = ['Apple', 'Orange', 'Banana', 'Kiwi']
l_b = ['Beef', 'Chicken', 'Poke']

for fruit, meat in zip(l_a, l_b):
 print(fruit, meat)

>> Apple Beef
>> Orange Chicken
>> Banana Poke

要素数の少ないリストにあわせて動作します。この例であれば l_a[3] = 'Kiwi' が無視されるわけです。

要素数の多いリストに合わせて動作させる方法もあります。zip の代わりに zip_longest を使います。以下の例を見てください。zip_longest を使うにはコードの先頭に from itertools import zip_longest を記述する必要があります。

from itertools import zip_longest

l_a = ['Apple', 'Orange', 'Banana', 'Kiwi']
l_b = ['Beef', 'Chicken', 'Poke']

for fruit, meat in zip_longest(l_a, l_b):
    print(fruit, meat)

>> Apple Beef
>> Orange Chicken
>> Banana Poke
>> Kiwi None

リスト l_a の最後にある Kiwi まで表示されていますね。また要素が 3 つしかない l_b に対しては None が補完されています。デフォルトでは None が補完されますが fillvalue を使うことで補完したい値を設定可能です。以下の例を見てください。

from itertools import zip_longest

l_a = ['Apple', 'Orange', 'Banana', 'Kiwi']
l_b = ['Beef', 'Chicken', 'Poke']

for fruit, meat in zip_longest(l_a, l_b, fillvalue='Empty'):
   print(fruit, meat)

>> Apple Beef
>> Orange Chicken
>> Banana Poke
>> Kiwi Empty

zip_longest の 3 つ目の引数として fillvalue='Empty' を設定しています。要素数の少ない方のリストに対して Empty という文字列を補完するという意味になります。

では、異なるデータ型で zip を使う例も見てみましょう。リスト l_a とタプル t_b を扱います。

l_a = ['Apple', 'Orange', 'Banana']
t_b = ('Beef', 'Chicken', 'Poke')

for fruit, meat in zip(l_a, l_b):
    print(fruit, meat)

>> Apple Beef
>> Orange Chicken
>> Banana Poke

異なるデータ型でも zip はうまく扱えていますね。もちろん 3 つになっても 4 つになっても同様に扱えます。

今回は zipzip_longest を使った複数のイテラブルなオブジェクトを使った反復処理についてまとめてみました。

反復処理に関するまとめの続きは以下からどうぞ。

では、ごきげんよう。


この記事が気に入ったらサポートをしてみませんか?