紹介
リスト内包表記は、既存のリストに基づいてリストを簡潔に作成する方法を提供します。リスト内包表記を使用すると、リストだけでなく、イテラブル、つまり文字列やタプルを活用してリストを構築することができます。
構文上、リスト内包表記は式を含むイテラブルに続くfor
句で構成されます。これには追加のfor
句やif
句が続くことがあり、forループや条件文に精通しているとリスト内包表記を理解するのに役立ちます。
リスト内包表記は、リストやその他の順序付けられたデータ型を作成するための代替構文を提供します。他の反復の方法であるfor
ループなどを使用してリストを作成することもできますが、プログラムで使用される行数を制限できるため、リスト内包表記が好まれる場合があります。
前提条件
Python 3がインストールされ、コンピューターまたはサーバーにプログラミング環境が設定されている必要があります。プログラミング環境が設定されていない場合は、お使いのオペレーティングシステム(Ubuntu、CentOS、Debianなど)に適したローカルプログラミング環境またはサーバー上のプログラミング環境のインストールおよび設定ガイドを参照してください。
リスト内包表記
Pythonでは、リスト内包表記は次のように構築されます:
情報: このチュートリアルの例コードに従うには、python3
コマンドを実行してローカルシステム上でPythonインタラクティブシェルを開きます。その後、>>>
プロンプトの後にそれらを追加することで、例をコピー、貼り付け、または編集できます。
A list, or other iterable, is assigned to a variable. Additional variables that stand for items within the iterable are constructed around a for
clause. The in
keyword is used as it is in for
loops, to iterate over the iterable
.
次は、文字列に基づいてリストを作成する例を見てみましょう。
ここでは、新しいリストが変数shark_letters
に割り当てられ、letter
が反復可能な文字列'shark'
に含まれるアイテムを表すために使用されています。
新しいリストshark_letters
の外観を確認するために、それをprint()
して次の出力を受け取ります。
Output['s', 'h', 'a', 'r', 'k']
リスト内包表記で作成したリストは、文字列'shark'
のアイテムで構成されています。つまり、各文字に1つの文字列です。
リスト内包表記はfor
ループとして書き直すことができますが、すべてのfor
ループがリスト内包表記として書き直すことができるわけではありません。
上記のshark_letters
リストを作成したリスト内包表記をfor
ループとして書き直してみましょう。これにより、リスト内包表記がどのように機能するかをよりよく理解できるかもしれません。
for
ループでリストを作成する場合、リストに割り当てられる変数は空のリストで初期化する必要があります。これは、コードブロックの最初の行で行われています。そして、for
ループは、反復可能な文字列'shark'
内の変数letter
を使用して反復します。 for
ループ内では、文字列内の各アイテムがlist.append(x)
メソッドを使ってリストに追加されます。
リスト内包表記をfor
ループとして書き直すと、同じ出力が得られます:
Output['s', 'h', 'a', 'r', 'k']
リスト内包表記はfor
ループとして書き直すことができ、一部のfor
ループはリスト内包表記に書き直すことができ、コードをより簡潔にすることができます。
リスト内包表記で条件文を使用する
リスト内包表記は、新しいリストを作成する際に既存のリストやその他の順次データ型を修正するために条件文を利用することができます。
条件文を使用したリスト内包表記の例を見てみましょう:if
文がリスト内包表記で使用されている例を見てみましょう。
リスト内包表記は、タプルfish_tuple
を基にしてfish_list
という新しいリストを作成します。 for
およびin
のキーワードが使用されており、これらは上記のセクションで使用されたものと同じです。そして今、if
ステートメントが追加されます。 if
ステートメントでは、文字列'octopus'
と等しくないアイテムのみを追加するように指示されています。したがって、新しいリストは、'octopus'
と一致しないタプルのアイテムのみを受け入れます。
これを実行すると、fish_list
には'octopus'
の文字列を除いてfish_tuple
と同じ文字列が含まれていることがわかります:
Output['blowfish', 'clownfish', 'catfish']
したがって、新しいリストには、条件文によって除外された文字列を除く、元のタプルのすべてのアイテムが含まれています。
次に、数学演算子、整数、およびrange()
シーケンス型を使用した別の例を作成します。
作成されるリストnumber_list
は、0から9の範囲の各アイテムの二乗値で構成され、アイテムの値が2で割り切れる場合に限ります。出力は以下の通りです:
Output[0, 4, 16, 36, 64]
リスト内包表記が行っていることをもう少し詳しく説明しましょう。たとえば、単にx for x in range(10)
を呼び出している場合、出力は以下のようになります:
Output[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
次に、条件文を追加しましょう:
Output[0, 2, 4, 6, 8]
このif
文は、最終リスト内のアイテムを偶数のみに限定し、すべての奇数を省略します。
最後に、各x
を二乗する演算子を追加できます:
したがって、前の[0, 2, 4, 6, 8]
のリスト内の各数字が二乗されます:
Output[0, 4, 16, 36, 64]
また、リスト内包表記でネストされたif
文を再現することもできます:
ここでは、リスト内包表記はまず数字x
が3で割り切れるかどうかをチェックし、次にx
が5で割り切れるかどうかをチェックします。もしx
が両方の要件を満たしていれば、出力されます。結果は以下の通りです:
Output[0, 15, 30, 45, 60, 75, 90]
条件付きif
文は、既存のシーケンスから新しいリストの作成に含まれるアイテムを制御するために使用できます。
リスト内包表記内のネストされたループ
入れ子のループを使用して、プログラム内で複数の繰り返しを実行できます。
今回は、既存の入れ子のfor
ループ構造を見直し、リスト内包表記に進んでみましょう。
次のコードは、2つのリストを繰り返し処理し、それらに基づいて数学的な操作を行う新しいリストを作成します。以下は、入れ子のfor
ループのコードブロックです:
このコードを実行すると、次の出力が得られます:
Output[40, 80, 120, 80, 160, 240, 120, 240, 360]
このコードは、各繰り返しで最初のリストのアイテムを2番目のリストのアイテムで乗算しています。
これをリスト内包表記に変換するには、各コード行を1行にまとめます。最初にx * y
操作が来ます。これに続いて外側のfor
ループ、そして内側のfor
ループが続きます。そして、print()
ステートメントをリスト内包表記の下に追加して、新しいリストが上記の入れ子のfor
ループブロックで作成したリストと一致することを確認します:
Output[40, 80, 120, 80, 160, 240, 120, 240, 360]
リスト内包表記は、入れ子のfor
ループを1行のコードにまとめ、まだmy_list
変数に割り当てる正確な同じリストを作成します。
リスト内包表記は、複数の行のコードを1行にまとめる簡潔な方法を提供しますが、コードの可読性が常に優先されるべきだということを念頭に置いておくことが重要です。そのため、リスト内包表記の行が長すぎるか扱いにくい場合は、ループに分割するのが最善です。
結論
リスト内包表記は、1つのリストや他のシーケンスを新しいリストに変換することを可能にします。このタスクを完了するための簡潔な構文を提供し、コードの行数を制限します。
リスト内包表記は、集合ビルダー表記または集合内包表記の数学的形式に従うため、数学的なバックグラウンドを持つプログラマーにとって特に直感的かもしれません。
リスト内包表記はコードをより簡潔にすることができますが、最終的なコードが可能な限り読みやすいことを確認することが重要です。そのため、非常に長い単一行のコードは避けるべきで、コードがユーザーフレンドリーであることを確認する必要があります。
Source:
https://www.digitalocean.com/community/tutorials/understanding-list-comprehensions-in-python-3