Pythonで複数リストの値を同時に取得するzip関数のイメージ画像

Pythonで複数リストの値を同時に取得するzip関数

  • 公開日:2018/10/18
  • 更新日:2018/10/19
  • 投稿者:n bit

Pythonで複数のリストオブジェクトがあり、それぞれのデータを同時に取得して扱いたいときに便利な組み込み関数『zip関数』について解説。データとそれに紐付くラベルやインデックスを同時に扱いたい時によく利用します。

  • Python

この記事は約 分で読めます。(文字)

zip関数とは

zip関数とは複数あるリストの値を同時に取得して扱いたいときに利用できる組み込み関数です。

例えば値に紐付くラベルのリストやインデックスリスト等があるとき、ラベルと値、インデックスと値といったように紐付けて同時に取得する場合にZip関数を使用します。

zip関数の使い方

では早速zip関数を使ってみましょう。zip関数は引数に2つ以上のリストオブジェクトを指定することができます。

扱いたいリストオブジェクトが2つの場合は、第1引数に1つ目のリストオブジェクト、第2引数に2つ目のリストオブジェクトを指定します。

zip(リストオブジェクト1,  リストオブジェクト2)

zip関数を使って実際に複数のリストオブジェクトを同時に呼び出してみましょう。zip関数はリストオブジェクトのデータを連続で呼び出すため基本的にfor文とあわせて利用します。

ラベルデータと値をもつ2つのリストオブジェクトをzip関数でまとめて取得

ラベルデータを格納したリストオブジェクトと値を格納したリストオブジェクトをzip関数でまとめて取得してみます。返された値をprint関数で出力しました。

st_name = ['大川', '城山', '佐々木', '都築', '野本']

st_value = [95, 87, 76, 89, 92]

for name, value in zip(st_name, st_value):
print('氏名:{0} 点数:{1}点'.format(name, value))

出力結果

氏名:大川 点数:95点

氏名:城山 点数:87点
氏名:佐々木 点数:76点
氏名:都築 点数:89点
氏名:野本 点数:92点

ラベルと値が順番通りに紐付いて取得されていることが確認できます。

インデックスデータと値をもつ2つのリストオブジェクトをzip関数でまとめて取得

今度はラベルデータではなくインデックスデータで値と紐付けてzip関数でまとめて取得してみます。

完全な連番でのインデックスデータと紐付ける場合はリストオブジェクトを用意するよりもemulate関数で生成した方が良いのですが今回の事例のように完全な連番のインデックスデータでない場合はzip関数で出力する必要があります。

st_no = [1, 2, 5, 8, 10]

st_value = [95, 87, 76, 89, 92]

for no, value in zip(st_no, st_value):
print('No,:{0} 点数:{1}点'.format(no, value))

出力結果

No,:1 点数:95点

No,:2 点数:87点
No,:5 点数:76点
No,:8 点数:89点
No,:10 点数:92点

インデックスと値が順番通りに紐付いて取得されていることが確認できます。

3つ以上のリストオブジェクトの値をzip関数でまとめて取得

先ほどまでは2つのリストオブジェクトをまとめてzip関数で取得していましたが、次は3つ以上のリストオブジェクトの場合です。基本的なやり方は2つでも3つ以上でも変わりません。増えたリストオブジェクトを引数に指定していくだけです。

st_no = [1, 2, 5, 8, 10]

st_name = ['大川', '城山', '佐々木', '都築', '野本']
st_value = [95, 87, 76, 89, 92]

for no, name, value in zip(st_no, st_name, st_value):
print('No,:{0} 氏名:{1} 点数:{2}点'.format(no, name, value))

出力結果

No,:1 氏名:大川 点数:95点

No,:2 氏名:城山 点数:87点
No,:5 氏名:佐々木 点数:76点
No,:8 氏名:都築 点数:89点
No,:10 氏名:野本 点数:92点

インデックストとラベル、そして値が順番通りに紐付いて取得されていることが確認できます。

注意事項:各リストオブジェクトの要素数にズレがある場合

基本的にzip関数を利用する場合はすべてのリストオブジェクトの要素数を揃えておく必要があります。もしも各リストオブジェクトの要素数にズレがあった場合は最小の要素数に合わされ、それよりも多いリストオブジェクトの要素は全て無視されます。

st_name = ['大川', '城山', '佐々木']

st_value = [95, 87, 76, 89, 92]

for name, value in zip(st_name, st_value):
print('氏名:{0} 点数:{1}点'.format(name, value))

出力結果

氏名:大川 点数:95点

氏名:城山 点数:87点
氏名:佐々木 点数:76点

ラベルのリストオブジェクトの要素数(3つ)にあわせて値のリストオブジェクトの要素は4つ目から無視されているのが分かります。

複数のリスト要素をタプルでまとめたリストオブジェクトを取得

zip関数はfor文でまとめて値を取得していくしていくだけではなく複数のリストオブジェクトをタプルの要素にまとめて1つのリストオブジェクトに変換することもできます。

出力されたオブジェクトを以前学習したtype関数でもチェックしてみましょう。type関数の利用方法については下記のページをご参照ください。

st_name = ['大川', '城山', '佐々木', '都築', '野本']

st_value = [95, 87, 76, 89, 92]

tu = list(zip(st_name, st_value))
print(tu)
print(type(tu))

出力結果

[('大川', 95), ('城山', 87), ('佐々木', 76), ('都築', 89), ('野本', 92)]

<class 'list'>

タプルの要素を持ったリストオブジェクトが生成されているのを確認できます。

リスト関数で出力しなかった場合はそのままzipオブジェクトとして生成されます。zipオブジェクトの中身はリスト化した時と同じでタプルが保持されています。

st_name = ['大川', '城山', '佐々木', '都築', '野本']

st_value = [95, 87, 76, 89, 92]

tu = zip(st_name, st_value)
print(tu)
print(type(tu))

出力結果

<zip object at 0x7f4351818608>

<class 'zip'>

オブジェクトのタイプがzipになっていることが確認できます。

今日のdot

zip関数は複数のリストオブジェクトをまとめて同時に取得することができる組み込み関数です。ラベルやインデックスデータと値を保管するリストオブジェクトが分かれている場合などに活用しましょう。