#リスト内包表記とは
Pythonに手を染めてから、理解しがたく、しかし魅力的なのはリスト内包表記(list comprehension)です。”comprehension”とは英語で理解と丸暗記しましたが、包含、内包力というような「包み込む」といった意味があるようです。
通常、num_listの各要素の値に対し1を加えたnum_plusを作る場合には次のようにfor-loopを使います。
"""
forループを使い、リストの各要素に1を加えた数値のリストを作成
"""
num_list = [0,1,2,3,4]
num_plus = []
for num in num_list:
num_plus.append(num + 1)
num_plus
これに対し、リスト内包表記では次のようになります。
"""
リスト内包表記を使って、リストの各要素に1を加えた数値のリストを作成
"""
num_list = [0,1,2,3,4]
num_plus = [num + 1 for num in num_list]
num_plus
#リスト内容表記はリスト以外もできる
いずれも結果は[1, 2, 3, 4, 5]となります。前のfor-loopの2~4行目が1行に収まってしまいました。3行目のfor-loopが行の後半に、4行目のappendする値が行の前半に、そして2行目のリストの初期化は、式を”[ ]”で囲うことで表記できます。ちょっと戸惑いますが、並べてみると簡単です。ちなみに、リスト内包表記はリストだけではなくタプル(tuple)や集合(set)などイテラブル(iterable)なものであればインプットで使うことができます。Iterableは繰り返し(iterate)ができるという意味です。タプルの場合は次のようになります。
"""
内包表記を使って、タプルの各要素に1を加えた数値のリストを作成
"""
num_tuple = (0,1,2,3,4)
num_plus = [num + 1 for num in num_list]
num_plus
集合(set)でも同様です。
"""
内包表記を使って、集合の各要素に1を加えた数値のリストを作成
"""
num_set = {0,1,2,3,4}
num_plus = [num + 1 for num in num_list]
num_plus
いずれも結果は[1, 2, 3, 4, 5]となります。
一方アウトプットにはアウトプットのnum_plusはタプルは使えません。タプルとは複数の構成要素からなる組をいいますがイミュータブル(immutable) は作成後にその状態を変えることのできないことをいいます。ちなみにimmuteとは変化するという意味です。
"""
リスト内包表記を使って、リストの各要素に1を加えた数値のタプルを作成しようとしたら
ジェネレータオブジェクトが生成された例
"""
num_list = [0,1,2,3,4]
num_plus = (num + 1 for num in num_list)
num_plus
上記のプログラムを実行すると、ジェネレータ式というものが生成され、つぎにような結果になります。ジェネレータについは現時点で、私の理解を超えているのでまた勉強したいと思います。
<generator object <genexpr> at 0x000001A1C38B7620>
これは、次のプログラムを実行すると8行目のタプルとして定義したnum_plusにappendメソッドを使うことができないためであると思われます。
"""
forループを使って、タプルにappendメソッドを使おうとしてエラーとなる例
"""
num_list = [0,1,2,3,4]
num_plus = ()
for num in num_list:
num_plus.append(num + 1)
num_plus
この結果は次にようなエラーになります。
AttributeError Traceback (most recent call last)
<ipython-input-6-cdaba0cccdcf> in <module>()
6 num_plus = ()
7 for num in num_list:
----> 8 num_plus.append(num + 1)
9 num_plus
AttributeError: 'tuple' object has no attribute 'append'
一方setはイミュータブルなので、次のようなことも可能です。
"""
内包表記を使って、集合の各要素に1を加えた数値の集合を作成
"""
num_list = [0,1,2,3,4]
num_plus = {num + 1 for num in num_list}
num_plus
結果は{1, 2, 3, 4, 5}となります。