Python基礎~リスト内包~

はじめに

こんにちは。風助です。

今回はリスト内包について書いていきます。
この「リスト内包」はlambda式な度と同じようにコードの行数を大幅に減らすことができる便利なものです。活用できるよう、学んでいきましょう。

リスト内包とは

リスト内包、リスト内包表記と言われることもあります。これはリストを作成する方法の一つです。
実際に見比べてみた方が早いと思うので早速書いていきます。

List1 = []
for x in range(10):
    List1.append(x * 2)

List2 = [x*2 for x in range(10)]

このような2つのリストがあるとしましょう。これら2つのリストの中身は全く同じものになります。
3行必要だったものがリスト内包を使うことで1行に短縮できました。
便利、何よりこの書き方の方が上級者っぽく見えそうですよね。

リスト内包の書き方

では次にリスト内包の書き方について。

[式 for節もしくはif節]

書き方は上のようにシンプルです。多分上のものだけで理解できる人はいないでしょうが。

リスト内包は式とそれに続くfor節、もしくはif節によって成り立ちます。そしてそれを大かっこで囲えば完成です。

式という部分にはタプルを仕込むこともできます。その場合はかっこで囲む必要があります。

for節、if節の個数はいくつでもOKです。
と言っても多すぎると読みづらいものになってしまいます。そんなときはおとなしく「.append」を使いましょう。

いくつか具体例とともに見ていきましょう。

List2 = [x*2 for x in range(10)]

まずはこれ。
式は「x*2」のところです。xを2倍にするだけの簡単なものです。
そしてfor節は「for x in range(10)」のところです。0~9までの数字を順に出力するだけです。
出来上がるリストは以下の通り。

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

for節一つなので分かりやすいですね。

では次に行ってみましょう。

List3 = [(x, y*2)for x in range(5) for y in [1, 2, 5]]

式は「(x, y*2)」の部分。タプルなのでかっこで囲います。
for節は2つあります。「for x in range(5)」と「for y in [1, 2, 5]」の2つです。
すでに読みづらくなっている気がしますがこれくらいなら問題ないでしょう。
出力されるリストは以下のようになります。

[(0, 2), (0, 4), (0, 10), (1, 2), (1, 4), (1, 10), (2, 2), (2, 4), (2, 10), (3, 2), (3, 4), (3, 10), (4, 2), (4, 4), (4, 10)]

この「List3」と同じリストをリスト内包を使わずに書くと以下のようになります。

List4 = []
for x in range(5):
    for y in [1, 2, 5]:
        List4.append((x, y*2))

どちらが見やすいかは人それぞれだと思います。やりやすいようにしてください。

ちなみにmap関数を使ってもリストを1行で表すことができます。リスト内包の方が見やすいのですが。

リスト内包は三項演算子やzip関数、enumerate関数などと組み合わせることができます。
ここに挙げた関数以外の関数や記法と組み合わせることも可能です。組み合わせは無限大ですからね。

おわりに

今回はリスト内包について書きました。

皆さんの参考になれば幸いです。

コメント

  1. […] […]

  2. Once I originally commented I clicked the -Notify me when new feedback are added- checkbox and now each time a remark is added I get four emails with the identical comment. Is there any manner you may take away me from that service? Thanks!

  3. Great post. I was checking continuously this blog and I’m impressed! Very useful info specifically the last part 🙂 I care for such information a lot. I was looking for this particular info for a very long time. Thank you and best of luck.

タイトルとURLをコピーしました