はじめに
AI(人工知能)と言えばPython、
Pythonと言えばリスト内包表記、
という事で、初心者向けのリスト内包表記(list comprehension)に関する記事を書いてみようと思います。
リスト内包表記とは、元になるリストから新しいリストを生成するための表記です。
リスト [ ] の中に処理を書く(内包する)表記、という意味だと思います。
元になるリスト
まずは、Pythonのリスト(配列)を定義してみましょう。
要素が4つあるリストは、以下のように書けます。
list1 = ['a', 'b', 'c', 'd']
list1をprint関数で出力すると
['a', 'b', 'c', 'd']
と返ってきます。
paiza.ioというウェブサービスでPythonの実行ができます。 https://paiza.io/ja/projects/new?language=python3
埋め込みもできるようです。
リスト内包表記してみる
このリストをリスト内包表記で加工して新しいリストを作ってみます。
基本
例1: 中身の文字を2回繰り返したリストを作る
result1 = [v + v for v in list1] print(result1)
結果は、
['aa', 'bb', 'cc', 'dd']
という値が返ってきます。
for v in list1
の部分でlist1の要素の数だけループして、
v + v
の部分で、各要素の文字列を2つ結合しています。これを新しい配列として返しています。
ちなみに v は valueの頭文字を取って v にしてみました。
条件をつける
例2:
最後の'd'は要らないので除外してリストを作る
result2 = [v + v for v in list1 if v is not 'd'] print(result2)
このように書くと、結果は
['aa', 'bb', 'cc']
になります。
if v is not 'd'
の部分で要素の値が 'd' の場合は、生成するリストに含めない、という条件(Condition)になります。
ループ処理で書いた場合
リスト内包表記は、ループでも同じ結果を作ることができます。
単純な処理なら、リスト内包表記の方が簡潔に書けるので、リスト内包表記が便利です。
逆に、複雑な処理をする場合は、リスト内包表記を使うと処理を詰め込むことになるので、分かりづらくなります。
result3 = [] for v in list1: v1 = v + v result3.append(v1) print(result3)
出力結果:
['aa', 'bb', 'cc', 'dd']
実用的な雰囲気を醸し出した例
上の説明だけだと、結局何に使うんだろう、と思われてしまいそうなので、 具体的な目的がある例を紹介します。
元になるリスト(その2)
list2 = [ {'id': 1, 'name': 'mike'}, {'id': 2, 'name': 'susan'}, {'id': 3, 'name': 'kubotti'}, ]
このリストは2次元の表形式のデータです。
dict型(キーと値のセット)のデータがリストになっています。
ちなみに、Pythonは最後の要素のあとにカンマ(,)があっても大丈夫な言語です。
表にすると、
ID | 名前 |
---|---|
1 | マイク |
2 | スーザン |
3 | くぼっち |
のようなデータだと思ってください。
このリストを使ってリスト内包表記で新しいリストを作ります。
条件をつける
例1: kubottiを除外する条件(Condition)を付ける
上記のリストで、くぼっちは要らないな、となった場合、以下のように処理を書きます。
idが3未満の要素だけでリストを生成します。
# 1. Get only 1,2 result1 = [rec for rec in list2 if rec['id'] < 3] print(result1)
出力結果:
[{'id': 1, 'name': 'mike'}, {'id': 2, 'name': 'susan'}]
kubottiが消えてしまいました。残念です。
値の一部からリストを作る
例2: 名前だけのリストを作る
名前だけを取り出したリストを作りたい場合は、以下のように書きます。
# 2. Create list of name result2 = [rec['name'] for rec in list2] print(result2)
出力結果:
['mike', 'susan', 'kubotti']
dict型からlist型の配列を作る
例3: 辞書型(dict型)の配列からリストを作る
# 3. Transform to list result3 = [[val for key, val in rec.items()] for rec in list2] print(result3)
出力結果:
[[1, 'mike'], [2, 'susan'], [3, 'kubotti']]
この例では、2重のループをしています。
最初のループは、
for rec in list2
です。
2回目のループは、
for key, val in rec.items()
の部分で、.items() を付けることでdict型のkeyとval(value)を取り出しています。
次回予告
次回のリスト内包表記の記事は、この記事を書くために試した、もう少しだけ複雑なコードを載せようと思います。