3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Pythonでのリスト内包表記について

Last updated at Posted at 2018-05-22

#リスト内包表記とは
Pythonに手を染めてから、理解しがたく、しかし魅力的なのはリスト内包表記(list comprehension)です。”comprehension”とは英語で理解と丸暗記しましたが、包含、内包力というような「包み込む」といった意味があるようです。
通常、num_listの各要素の値に対し1を加えたnum_plusを作る場合には次のようにfor-loopを使います。

program1
"""
forループを使い、リストの各要素に1を加えた数値のリストを作成
"""

num_list = [0,1,2,3,4]
num_plus = []
for num in num_list:
    num_plus.append(num + 1)
num_plus

これに対し、リスト内包表記では次のようになります。

program2

"""
リスト内包表記を使って、リストの各要素に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)ができるという意味です。タプルの場合は次のようになります。

program3
"""
内包表記を使って、タプルの各要素に1を加えた数値のリストを作成
"""

num_tuple = (0,1,2,3,4)
num_plus = [num + 1 for num in num_list]
num_plus

集合(set)でも同様です。

program4
"""
内包表記を使って、集合の各要素に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とは変化するという意味です。

program5
"""
リスト内包表記を使って、リストの各要素に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メソッドを使うことができないためであると思われます。

program6
"""
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はイミュータブルなので、次のようなことも可能です。

program7
"""
内包表記を使って、集合の各要素に1を加えた数値の集合を作成
"""

num_list = [0,1,2,3,4]
num_plus = {num + 1 for num in num_list}
num_plus

結果は{1, 2, 3, 4, 5}となります。

3
4
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?