Part17:リストの応用

真姫「前にリストの説明をしたでしょ?今回はあれをもう少し補足しておくわ」
にこ「リストはPythonの肝って言ってたわよね」
真姫「まあね。リストにありがちなソートと、リスト内包表記という便利な記法を紹介するわ」

真姫「まずはソート。基本的には、sortとかsortedとか関数が用意されてるから、それを使えば簡単」

絵里「sortとsortedっていうのは?」
真姫「sortは破壊操作、sortedは非破壊操作。sortedが元のリストは変更せずにソートされたリストを返すのに対して、sortは元のリストを直接ソートするの」
絵里「じゃあ上の例だとlは変更されないけど、sortにするとlが変更されるわけね」
真姫「そう。どちらを使うかは状況次第だけど・・・個人的には、副作用のないsortedが好みかしら」

真姫「じゃあ応用。こんな入れ子のリストをソートしたい場合」

にこ「ちゃんとここにいない人を例に使うあたり、真姫は良心的にこ」
真姫「だって私が比べられるの嫌だもの」
絵里(多分私が何言っても反発しか買わないチカ)
真姫「とにかく、この3人を胸の順にソートするわ」

絵里「lambda?」
真姫「ラムダ式といって、無名関数を定義する構文よ」
絵里「無名関数って?」
真姫「lambda m: m[1]は、mを引数にとってmの2番目の要素を返す関数。defで定義するのと違って名前を持たないから無名関数」
絵里「その関数を、sorted関数に引数として渡してるの?」
真姫「そう。sortedのkeyパラメータは関数を受け取るわ。sortedは高階関数なの」
絵里「えーっと・・・まず、関数って変数みたいに他の関数に渡したり受け取ったりできる、ということよね?」
真姫「関数はオブジェクト、と考えるといいわ。関数オブジェクトは変数に代入できるし、その変数を介して関数を呼び出すこともできる」
絵里「それで、高階関数というのは・・・」
真姫「関数を引数に取る関数。アルゴリズムの一部を外から指定できるの。この例だと、何を基準にソートするかはkeyパラメータで渡した無名関数が判断しているわ」
絵里「つながってきたわ。その無名関数が['hono', 78]を受け取って78を返すから、それを基準にソートができるのね」
真姫「ご名答。この辺は結構難しいけど、一度分かってしまえば大丈夫なはずよ。ね、にこちゃん」
にこ「・・・にっこにっこにー☆」
真姫「ちょっと話聞いてたの!?」
絵里「ハラショー・・・」

真姫「もうにこちゃんなんて知らない」
にこ「に、にこはにこなりに理解しようと努力したにこ!」
絵里「はいはい、痴話喧嘩は置いておいて」
真姫「痴話喧嘩って何よ・・・はぁ、気を取り直してリスト内包表記の話に進むわ」

真姫「また2年生組に例題になってもらって、と。このデータ構造から、決め台詞だけ抜き出したいとするわ」
にこ「['ファイトだよっ!', 'ラブアロー☆シュート!', 'ちゅんちゅん']になればいいにこ?」
真姫「もうちょっとひねって・・・海未は、断固として嫌がるわよねその台詞」
絵里「『プライバシーの侵害ですっ!』ってね」
真姫「なので、海未以外の2人の台詞だけ抜き出すことにするわ。['ファイトだよっ!', 'ちゅんちゅん']になるように」
絵里「ええっと・・・」

絵里「こう?」
真姫「リスト内包表記を使うと、それを1行で書けるの」

にこ「わけがわからないにこ」
絵里「そうかしら。私のコードと照らし合わせると、なんとなくは・・・」
真姫「そうね、ほとんど書く順番組み替えただけだから。m[2]for m in secondif m[0] != 'umi'の3パートに分けると分かりやすいと思う」
にこ「そう言われると同じに見えてきたわ。最後リストにappendしてないのは、m[2]の結果が勝手にリストになるのね?」
真姫「そう。これはリストを作るための記法だから。これはすごくシンプルな例だけど、慣れた人が書くとかなり凶悪なワンライナーができあがるそうよ」
絵里「やりすぎると読めなくなりそうね・・・」

真姫「この通り、リストってPythonではとっても重要な要素なの。関数型っぽい書き方をする場合は特にね」
にこ「ただの配列だと思ってたら奥が深かったにこ・・・」
真姫「文法についての輪講はこれで終わりかしら。マニアックなあたりを除いて一通りやったと思うけど」
絵里「そうみたいね。ここからはどうする?」
にこ「ユニットテストを組まずしてプログラミングは語れないわ!」
真姫「ライブラリを使いこなさないと凝ったプログラムは書けないわね」
絵里「お題はまだありそうだし・・・今後はネタが見つかり次第、やっていく感じでいいかしら?」
真姫「それでいいわ」
にこ「じゃあこれからも、宇宙No.1プログラマにこにーをよろしく!ラブにこっ☆」
絵里「アイドルじゃなくなったの・・・」


LINEで送る
Pocket


返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です