Python、機械学習

【Python】覚えにくいけど便利な「リスト内包表記」を覚えよう

便利なんだけどなかなか覚えられない「リスト内包表記」。断続的にプログラミングをやっている身としては、このリスト内包表記がなかなか頭に入ってこないのです。そこで、自分への備忘録も兼ねて、「リスト内包表記」のやり方についてまとめました。

リスト内包表記とは

短くて簡単な表現でリストを作ってしまう方法です。順番に並んだ数字のリストを作るときに便利です。

分かりやすくするために、ジャニーズに例えてみました。ずばり、こうです。

 リスト = [ f(メンバー) for メンバー in グループ]  

リスト内包表記は「f(メンバー)」「for メンバー in グループ」の2ブロックから成っています。

「for メンバー in グループ」for文を回し、f(メンバー) をリストに加えていく、と考えれば腹落ちするのではないでしょうか。

f(メンバー)というのは関数を表しています。

嵐を例にリスト内包表記をやってみる

それでは、嵐を例に考えてみましょう。

arashi =['相葉雅紀', '大野智', '櫻井翔', '二宮和也', '松本潤']

arashi_member = [x for x in arashi]
arashi_member

[‘相葉雅紀’, ‘大野智’, ‘櫻井翔’, ‘二宮和也’, ‘松本潤’]

arashiというグループがあって、メンバーの変数をxにしてfor文を回します。そして、f(x)=xとして、f(x)をarashi_memberというリストに加えてきます。

リスト内包表記ではxまたはiが使われることが多いようです。

リスト内包表記を使わずに真面目(笑)にコードを書くと、こうなります。

arashi =['相葉雅紀', '大野智', '櫻井翔', '二宮和也', '松本潤']

arashi_member=[]

for x in arashi:
    fx = x
    arashi_member.append(fx)
    
arashi_member

[‘相葉雅紀’, ‘大野智’, ‘櫻井翔’, ‘二宮和也’, ‘松本潤’]

リスト内包表記のメリット

これを見てわかるように、リスト内包表記は、真面目に書く場合に比べてコードが短くて済みます。これがメリットです。

そして、リスト内包表記の方が処理時間が短いというメリットもあります。

おまけですが、プログラミングができるやつだと思わせることができる、というメリットもあります(笑)。

range()関数を使った例

グループのところは、リスト以外にもrange()関数でもオッケーです。リスト内包表記ではグループのところにrange()を使ったものがよくみられます。

numbers = [x for x in range(1,21)]
numbers

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]

上記はrange(1,21)、つまり1から20までの整数のかたまりをグループにしてfor文を回したものになります。

応用:f(メンバー)を変えてみる

これまではf(x) = xとしたリスト内包表記を紹介しました。こちらでは、f(x)を少し変えたものをやってみます。

numbers = [x*2 for x in range(21)]
numbers

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40]

f(x) =2xとした場合はこのような書き方になります。簡単ですね。

応用:if文を使う

if文を入れることで、より凝ったリスト内包表記ができます。

 リスト = [ f(メンバー) for メンバー in グループ  if 〇〇]  

if〇〇を満たすときにだけリストに追加してね、という意味です。

例えば、if文がない場合はこのようになります。

numbers = [x for x in range(21) ]
numbers

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]

if文を入れると、こんな感じになります。

numbers = [x for x in range(21) if x<11]
numbers

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

こちらも簡単です。

応用:split関数を使う

最後に、split関数を使った便利な方法を紹介します。

こちらは例を見てもらうのが早いです。

date = "1999/9/15/水"
time = [x for x in date.split('/')]
time

[‘1999’, ‘9’, ’15’, ‘水’]

こんな使い方もできます。

まとめ

Pythonのリスト内包表記について詳述しました。

for文を回してリストに追加する作業を一文で表したものがリスト内包表記です。さまざまな人のコードを写経していると高確率で遭遇しますので、ぜひ覚えていただければと思います。