【必須知識】pythonのzip関数の使い方まとめ(itertoolsモジュールとzip_longest関数)
2019.06.27
zip関数はあらかじめpython内に作られた関数(組み込み関数)で、異なるリストの要素を取得することができます。
pythonを今後使う方は必須な知識なので、これを期にしっかり覚えましょう。
zip関数とは
異なるイテラブルオブジェクト(リストやタプル)を同時に取り出してくれる処理を実行するのがzip関数です。
for 引数A, 引数B in zip(リストA, リストB, ・・・)
リストAとリストBのインデックスの値を、引数Aと引数Bで取得することができます。
例えば、「名前のリスト」と「年齢のリスト」を取得したい場合は、下記のコードになります。
python
# namesリスト、agesリストを取得して出力する
names = ['kan', 'takumi', 'yuki']
ages = [28, 12, 35]
for name, age in zip(names, ages):
print(name, age)
# 出力結果
kan 28
takumi 12
yuki 35
name(引数A)とage(引数B)をprintすることで、異なるリストの値を出力できます。
zip関数の使い方【基礎編】
zip関数は、2つのリストだけでなく、3つ以上のリストを取得することができます。
3つのリストを取得したい場合は、次のようなコードになります。
python
# namesリスト、agesリスト、countriesリストを取得して出力する
names = ['kan', 'takumi', 'yuki']
ages = [28, 12, 35]
countries = ['Japna', 'America', 'India']
for name, age, country in zip(names, ages, countries):
print(name, age, country)
# 出力結果
kan 28 Japna
takumi 12 America
yuki 35 India
2つのコードを取得する場合と基本的なことは変わりません。
【注意】リストのインデックス数が異なる場合
リストのインデックス数が異なる場合、多いインデックス分が表示されません。
namesリストに、他のリストよりも多い「shota」と「koki」のインデックスを追加してみます。
Python
# namesリストだけ「shota」と「koki」を追加する
names = ['kan', 'takumi', 'yuki', 'shota', 'koki']
ages = [28, 12, 35]
countries = ['Japna', 'America', 'India']
for name, age, country in zip(names, ages, countries):
print(name, age, country)
# 出力結果(shotaとkokiが出力されていない)
kan 28 Japna
takumi 12 America
yuki 35 India
「shota」と「koki」が出力されていないのがわかります。
インデックス数が異なる場合は注意しましょう。
zip関数の使い方【応用編】
もう少し深くzip関数についてみていきます。
itertoolsモジュールとzip_longest関数
原則、zip関数ではリストの要素数が異なる場合、多い要素が取得されないという性質を持っていますが、itertoolsモジュールとzip_longest関数を使うと多い要素も取得することができます。
python
# itertoolsモジュールの取得方法
from itertools import zip_longest
# zip_longestを用いて、多い要素を出力する
names = ['kan', 'takumi', 'yuki', 'shota', 'koki']
ages = [28, 12, 35]
for name, age in zip_longest(names, ages):
print(name, age)
# 出力結果
kan 28
takumi 12
yuki 35
shota None
koki None
上記のコードのように、itertools(モジュール)とzip_longest関数を用いると、「None」という値が出力されます。
また、「None」を、特定の値に変えることもできます。それが「fillvalue」です。
python
# itertoolsモジュールの取得方法
from itertools import zip_longest
# zip_longestにfillvalueを指定する
names = ['kan', 'takumi', 'yuki', 'shota', 'koki']
ages = [28, 12, 35]
for name, age in zip_longest(names, ages, fillvalue=30):
print(name, age)
# 出力結果
kan 28
takumi 12
yuki 35
shota 30
koki 30
shotaとkokiに30という値が出力されているのがわかると思います。
dict型・list型・tuple(タプル)型に変換
zip関数で異なるリストの値を取得し、他の型に変換することができます。
dict型・list型・tuple型の変換するコードは下記の通りです。
dict型に変換
Python
# dict型に変換
names = ['kan', 'takumi', 'yuki']
ages = [28, 12, 35]
dict(zip(names, ages))
# 出力結果
{'kan': 28, 'takumi': 12, 'yuki': 35}
list型に変換
Python
# list型に変換
names = ['kan', 'takumi', 'yuki']
ages = [28, 12, 35]
list(zip(names, ages))
# 出力結果
[('kan', 28), ('takumi', 12), ('yuki', 35)]
tuple(タプル)型に変換
Python
# tuple型に変換
names = ['kan', 'takumi', 'yuki']
ages = [28, 12, 35]
tuple(zip(names, ages))
# 出力結果
(('kan', 28), ('takumi', 12), ('yuki', 35))
zip関数まとめ
zip関数についてまとめると、以下の通りです。
- zip関数は異なる2つ以上のリストの値を取得できる
- リストの要素数が異なる場合は、多い要素は無視される
- itertools(モジュール)とzip_longest関数を用いると、リストの要素数が異なる場合に役立つ
- zip関数を用いて複数のリストを1つの型に変換することができる
pythonはデータの分析に用いられる言語なので、zip関数は必須な知識です。
使いこなせるまで、何度もコードを打って覚えましょう。