Python zip関数の使い方

Python学習【365日チャレンジ!】45日目のマスターU(@Udemy11)です。

今日は、女性が怒鳴っている姿を目にして、そんなに怒らなくてもいいのにな〜と思いつつ、女性の本能はおそろしや〜と感じてしまいました。

一方通行の狭い道路に向かい合って止まってる車があって、本来なら、逆走してしまった車がバックするべきなのに、一方通行ということもわかってなかったようで、対向する車から、女性が降りてきて大声で怒鳴ってるもんだから、逆走した車の女性はなにがなんだかわからずに恐怖に怯えている感じでした。

まー、わかってて逆走してたら、バックするだろうし、逆走した女性からすると「左右によってくれないと正面衝突しちゃうじゃない!」と思っていたかもしれません。

怒鳴っている女性に対して、

誰がみてるかわからないので、そんな怒っちゃだめですよ〜

といってあげればよかったのですが、恐ろしすぎて近づくこともできませんでした。

交通ルールは守らないといけませんね。

それでは、今日もPython学習をすすめていきましょう。

昨日の復習

昨日は、enumerate関数を学習しました。
enumerate関数は、リストの値だけでなく、index値も一緒に取得することができる関数でした。

for i, fruit in enumerate(['apple', 'peach', 'banana']):
    print(i, fruit)

出力結果

0 apple
1 peach
2 banana

enumerate関数を使わずに、for文だけを使って、index値用に変数iを定義して、ループごとに1を足すなんてコードを書かなくてもコードを2行に収めることができました。

zip関数の使い方

zipというと、ファイルの圧縮などで使われる拡張子のことしか思いつかなかったのですが、Pythonにもzipが存在します。

いくつかのリストから順番に値を取り出すことができるのがzip関数です。

zipのイメージ的には細かくコンパクトにまとめるという感じがしますが、Pythonのzip関数は、集約するイメージに近い感じでしょうか?

a = ('月', '火', '水')
b = ('apple', 'peach', 'banana')
c = ('tea', 'milk', 'water')
 
for i in range(len(a)):
	print(a[i], b[i], c[i])

zip関数を使わない場合は、上記のように長さを取得したあとに、range関数で変数aの長さの数だけ変数iにindex値を代入し、変数a,b,cの値を取得して出力するような形になります。

次にzip関数での出力方法をみてみましょう。

a = ('月', '火', '水')
b = ('apple', 'peach', 'banana')
c = ('tea', 'milk', 'water')
 
for day, food, drink in zip(a, b, c):
	print(day, food, drink)

出力結果

月 apple tea
火 peach milk
水 banana water

どちらのコードも出力結果は同じになります。

3つの変数a, b, cからindex順に値を取得して、それぞれの変数day, food, drinkに代入してくれます。

イメージとしては、値を縦横変換してペーストしている感じですね。

今回はタプルで試しましたが、リストでも同じように順番に値を取得することが可能です。

index数が違う場合

次はリストでやってみますが、index数が違う場合はどうなるか試してみました。

a = ['月', '火', '水', '木', '金']
b = ['apple', 'peach', 'banana']
 
for day, food, in zip(a, b):
	print(day, food)

出力結果

月 apple
火 peach
水 banana

結果はindexの少ない方に合わせてループが終了し、多い分の値は取得されませんでした。

a = ['月', '火', '水', '木', '金']
b = ['apple', 'peach', 'banana']
c = ['tea', 'milk']
 
for day, food, drink in zip(a, b, c):
	print(day, food, drink)

出力結果

月 apple tea
火 peach milk

変数を3つ指定して、最後の変数の値を2つにすると、2つの組だけ出力されました。

ネストされたリスト

次に試してみたのは、ネストされたリストを入れたら、同じように出力できるのか試してみました。

for i, j, k in [['月', '火', '水'], ['apple', 'peach', 'banana'], ['tea', 'milk', 'water']]:
	print(i, j, k)

出力結果

月 火 水
apple peach banana
tea milk water

読みは外れて、リストがそのままアンパッキングされて出力されました。

リストのアンパッキングと同じ動作になり、ネストされているリストがアンパッキングされました。

そういえば、少し前に学習していました。

当たり前ですが、上記のコードのネストされたリストをzip関数にかえると、最初出力結果が得られます。

for i, j, k in zip(['月', '火', '水'], ['apple', 'peach', 'banana'], ['tea', 'milk', 'water']):
	print(i, j, k)

出力結果

月 apple tea
火 peach milk
水 banana water

たまに振り返ることが大切

昨日の学習内容を振り返るようにしていますが、10日前に学習したことを振り返ることはあまりありませんでした。

ただ、1回だけ復習したところで、記憶の定着にはつながらないので、もう少し前に学習したこともたまに振り返って復習しないとどんどん忘れてしまうので、学習しているときに出てきたら、一旦立ち止まって過去に学習したコードとその周辺の学習内容を振り返ってみることが大切です。

振り返りつつ、前に進んで、しっかりと記憶を定着させましょう!

それでは、明日もGood Python!