※さらに30日間返金保証ありなので、実質リスクゼロ。
Python 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル
Pythonを使って、リストや辞書などのシーケンス型のデータを複数同時に扱えると便利だなーと思ったことはないでしょうか?
実はpythonには標準でzip関数という、リストなどを複数同時に扱える便利な関数が備わっています。
今回はそのzip関数について、誰でも分かるように基礎的なところから学んでいきたいと思います。
zip関数とは?
zip関数とは、複数のシーケンス(リストやタプルなど)を並列的に反復処理してくれる関数です。
zip関数は組み込み関数なので、特別何かライブラリをインポートする必要もなく利用することができます。
zip関数の引数には以下のようにリストなどを複数とります。
zip(list1, list2,...)
上の例のように引数にとったそれぞれのリストから1つずつ要素を取り出して、並列処理をしていくのです。
zip関数の基本的な使い方
zip関数は基本的に複数のシーケンスを並列処理してくれる関数です。以下ではfor文を使って、zip関数の適用の仕方を見ていきましょう。
2つのシーケンスを引数にとる
それではまず、zip関数の引数(かっこの中身)に2つのシーケンスをとることを考えましょう。
以下の例を見てください。
numbers = [1, 2, 3] fruits = ['cherry', 'melon', 'apple'] for number, fruit in zip(numbers, fruits): print(number, fruit) #以下は出力 1 cherry 2 melon 3 apple
zip関数の引数に1行目、2行目で作ったリストを入れると、numberとfruitにリスト内の要素が順々に入れられ、反復処理が行われます。
そして最終的に、numberとfruitが並んで出力されているのが分かると思います。
3つ以上のシーケンスを引数にとる
zip関数では上で見せたように引数が2個と決まっているわけではありません。
以下のように3つ以上のシーケンスを引数にとることもできます。
numbers = [1, 2, 3, 4] fruits = ['cherry', 'melon', 'apple'] drinks = ['tea', 'milk', 'coffee', 'beer'] for number, fruit, drink in zip(numbers, fruits, drinks): print(number, fruit, drink) #以下は出力 1 cherry tea 2 melon milk 3 apple coffee
それぞれのリストから取り出された要素がnumber、fruit、drinkに入れられて、printで出力されています。
ここでリストnumbersとdrinksの要素が4つありますが、zip関数では小さい方のシーケンスに合わせられるという決まりがあるので、fruitsの方の要素数と同じ3つの出力が得られています。
+αで覚えておきたいzip関数の使い方
zip関数は上で示したように、for文と一緒に使って並列処理を施す使い方とは別の使い方もあります。以下ではその内のいくつかについて説明していきます。
list関数の引数にzip関数をわたす
以下ではlist関数を使っていきます。
list関数を使うと他のデータ型のものをリスト型に変換できます。
以下で例を見ていきましょう。
fruits1 = ['cherry', 'melon', 'apple'] fruits2 = ['さくらんぼ', 'メロン', 'リンゴ'] list(zip(fruits1, fruits2)) #以下は出力 [('cherry', 'さくらんぼ'), ('melon', 'メロン'), ('apple', 'リンゴ')]
zip関数の引数にリストfruits1とfruits2をわたし、それをさらにlist関数の引数にします。
するとそれぞれのリストの要素がタプルごとに組になってリストの中に入ったものが出力されます。
ちなみにタプルとは上のように()で囲んで表現し、リストと似たようなデータ型のものです.(但しリストのように中身を自由に変えることはできない)。
dict関数の引数にzip関数をわたす
それでは次にdict関数を使っていきます。
dict関数を使うと、他のデータ型のものをdict型に変換することができます。
以下で例を見ていきましょう。
fruits1 = ['cherry', 'melon', 'apple'] fruits2 = ['さくらんぼ', 'メロン', 'リンゴ'] dict(zip(fruits1, fruits2)) #以下は出力 {'apple': 'リンゴ', 'cherry': 'さくらんぼ', 'melon': 'メロン'}
list関数の時とほとんど同じなので何をしているかは分かりますね。
ただdict関数を使うと、list関数の時のようにタプルで分けられるのではなく、辞書のキーと値になります。
辞書についてあまり理解していないという人は以下の記事を参考にしてください。
このようにdict関数とzip関数を一緒に使うと、ある意味英和辞典のようなものも作ることができます。
zip関数の引数にアスターリスク(*)を取って行と列を反転させる
zip関数の引数に*(アスターリスク)をつけると、行と列を反転させてくれます。
以下で例を見ていきましょう。
a = (1, 2, 3) b = (4, 5, 6) z1 = zip(a, b) z2 = zip(*z1) print(z1) print(z2) #以下は出力 [(1, 4), (2, 5), (3, 6)] [(1, 2, 3), (4, 5, 6)]
タプルaとbにzip関数を適用すると(z1)、普通通りそれぞれの要素がタプルによってペアになり、それがリストに入って出力されます。
しかしもう一度それにzip関数を適用し、引数に*をつけると(z2)、行と列が反転したものが出力されます。
まとめ
今回はpythonのzip関数について学んでいきました。
まずはfor文を使ったzip関数の並列処理という基本的なことから始め、最後には*(アスターリスク)を使う、ちょっと変わった使い方についても学びました。
zip関数のようにシーケンスを扱う関数はプログラミングの効率を上げてくれるので是非この機会にしっかりとマスターしてください。
今後も定期的にプログラミングに関する情報を発信していくので、興味のある人はブックマークして見にきてくれると嬉しいです!!
※さらに30日間返金保証ありなので、実質リスクゼロ。
Python 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル