Pythonでリスト内包表記

List Comprehensions Python



リスト内包表記は、Pythonでよく使用され、反復可能なオブジェクトをループして新しいリストまたは辞書を作成する1行のステートメントを記述します。この記事では、Pythonでリスト内包表記を使用する方法を説明します。まず、Pythonでforループがどのように機能するかについての基本的な説明から始めます。

PythonのForループ

Pythonのforループステートメントは、オブジェクト、リスト、文字列などのメンバーを順番に繰り返します。他のプログラミング言語と比較して、その構文ははるかにクリーンであり、手動で反復ステップを定義して反復を開始する必要はありません。その動作を他のプログラミング言語と同じにする方法はありますが(この記事では取り上げません)。また、continue、break、passなどのステートメントを使用して、forループをある程度制御することもできます。以下は、Pythonでのforループの簡単な例です。







にとってNS 範囲((10)。
印刷((NS)。

上記のforループは、0から始まり9で終わる10個の数値を出力します。



リスト内包表記

リスト内包表記は、ワンライナーステートメントで複数行のforループを記述するための簡略化された簡潔な方法に他なりません。以下のリスト内包表記の例では、xのすべての値を含めることにより、[0、1、2、3、4、5、6、7、8、9]として新しいリストを作成します。



数字= [NSにとってNS 範囲((10)。]
印刷 ((数字)。

リスト内包表記は常に新しいリストを作成し、式で使用されている元の反復可能オブジェクトを変更しないことに注意してください。一般的なリスト内包表記にはfor句が必要であり、その後にifおよびelse条件ステートメントを続けることができます。リスト内包表記を使用しない場合、上記の例は次のように記述されます。





数字= []
にとってNS 範囲((10)。
数字。追加((NS)。

印刷 ((数字)。

パフォーマンスと読みやすさ

リスト内包表記はforループよりも高速です。ただし、数十万を超えるアイテムを反復処理しない限り、パフォーマンスが大幅に向上することに気付くことはありません。リスト内包表記はforループを書くための簡潔な方法を提供しますが、複雑な式はコードの可読性を低下させ、冗長性を高める可能性があります。プログラムで最大のパフォーマンスを達成することが絶対に必要な場合を除いて、コードを読みやすくすることが重要です。

例:辞書とセットでのリスト内包表記構文の使用

Pythonディクショナリは、キーと値のペアで定義された要素のコレクションですが、セットは、重複が許可されていない一意の値のコレクションです。リスト内包表記は、Pythonの辞書やセットでも使用できます。構文は少し異なります。式を中括弧で囲む代わりに、中括弧を使用する必要があります。また、新しいリストの代わりに、新しい辞書/セットオブジェクトを取得します。



データ= {{'市''ニューヨーク' '名前''ジョン・ドウ'}

formated_data= {{k:v。題名(()。 にとってvデータ。アイテム(()。}

印刷 ((formated_data)。

上記の例では、文字列値をタイトルケースに変換し、formatted_dataという新しい辞書を作成します。この辞書の出力は、{‘city’: ‘New York’、 ‘name’: ‘John Doe’}になります。左側にある既存の辞書変数を指定して、辞書/セットをインプレースで変更することもできます。

データ= {{'市''ニューヨーク' '名前''ジョン・ドウ'}

データ= {{k:v。題名(()。 にとってvデータ。アイテム(()。}

印刷 ((データ)。

辞書内包表記を使用しない場合、コードは次のようになります。

データ= {{'市''ニューヨーク' '名前''ジョン・ドウ'}

formated_data= {{}

にとってvデータ。アイテム(()。
formated_data[] =v。題名(()。

印刷 ((formated_data)。

セットにはキーと値のペアがないため、セット内包はリスト内包と同じ方法で定義できます。唯一の違いは、中括弧の使用です。

例:リスト内包表記の複数のForループ

上記のリスト内包表記の例は基本的なものであり、単一のforステートメントを使用します。以下は、複数のforループと条件付きifステートメントを使用する例です。

形容詞= ['ディスク' 「Eoan」 「フォーカル」 「巧みな」]

動物= [「ディンゴ」 「オコジョ」 'ピット' 'ビーバー']

コードネーム= [x +''+およびにとってNS形容詞にとって動物もしもと。で始まる((NS[0])。]

印刷 ((コードネーム)。

コードは、出力として[‘Disco Dingo’、 ‘Eoan Ermine’、 ‘FocalFossa’]を表示します。 2つのforループは形容詞と動物のリストを調べ、両方の単語の最初の文字が同じである場合にのみ、それらのメンバーはスペースを使用して結合されます。リスト内包表記を使用しない場合、コードは次のようになります。

形容詞= ['ディスク' 「Eoan」 「フォーカル」 「巧みな」]
動物= [「ディンゴ」 「オコジョ」 'ピット' 'ビーバー']

コードネーム= []

にとってNS形容詞:
にとって動物:
もしもと。で始まる((NS[0])。
コードネーム。追加((x +''+および)。

印刷 ((コードネーム)。

例:if-else句を使用したリスト内包

以下の例は、リスト内包表記でのifおよびelseステートメントの使用法を示しています。

number_list= [1 2 3 4]
another_list= [5 6 7 8]

結果= [NS もしも ((x + y)。2 == 0 そうしないと NS にとってNSnumber_listにとってanother_list]

印刷 ((結果)。

2つのリストをループしている間、上記のリスト内包表記は、要素のペアの合計が偶数であるかどうかをチェックします。上記のコードを実行すると、[True、False、True、False、False、True、False、True、True、False、True、False、False、True、False、True]が出力として表示されます。リスト内包表記を使用しない場合、コードは次のようになります。

number_list= [1 2 3 4]
another_list= [5 6 7 8]
結果= []

にとってNSnumber_list:
にとってanother_list:
もしも ((x + y)。2 == 0
結果。追加((NS)。
そうしないと
結果。追加((NS)。

印刷 ((結果)。

結論

リスト内包表記は、クリーンで簡潔なループステートメントを作成するための優れた方法を提供します。ただし、複数のループと条件ステートメントが使用されている場合、それらはすぐに複雑になり、理解するのが難しくなる可能性があります。結局のところ、それはプログラマーの快適さのレベルになりますが、一般的には、速記を過度に使用するのではなく、明示的で読みやすく、デバッグしやすいコードを書くことをお勧めします。