序章

リスト内包表記は、既存のリストに基づいてリストを作成する簡潔な方法を提供します。 リスト内包表記を使用する場合、リストは、文字列およびタプルを含む任意の反復可能を利用して作成できます。

構文的には、リスト内包表記は、式とそれに続く式を含むイテレータで構成されます。 for 句。 これに続いて追加することができます for また if 句なので、 forループおよび条件文に精通していると、リスト内包表記をよりよく理解するのに役立ちます。

リスト内包表記は、リストやその他の順次データ型を作成するための代替構文を提供します。 他の反復方法、たとえば for ループは、リストの作成にも使用できます。プログラムで使用される行数を制限できるため、リスト内包表記が推奨される場合があります。

前提条件

Python 3をインストールし、コンピューターまたはサーバーにプログラミング環境をセットアップする必要があります。 プログラミング環境をセットアップしていない場合は、ローカルプログラミング環境またはサーバー上のプログラミング環境のインストールおよびセットアップガイドを参照して、オペレーティングに適したものにすることができます。システム(Ubuntu、CentOS、Debianなど)

リスト内包

Pythonでは、リスト内包表記は次のように構成されます。

情報:このチュートリアルのサンプルコードに従うには、ローカルシステムでPythonインタラクティブシェルを開いて、 python3 指図。 次に、例の後に追加して、例をコピー、貼り付け、または編集できます。 >>> 促す。

list_variable = [x for x in iterable]

リストまたは他の反復可能なものが変数に割り当てられます。 イテレータ内のアイテムを表す追加の変数は、 for 句。 The in キーワードはそのまま使用されます for ループ、反復する iterable.

文字列に基づいてリストを作成する例を見てみましょう。

shark_letters = [letter for letter in 'shark']
print(shark_letters)

ここで、新しいリストが変数に割り当てられます shark_letters、 と letter 反復可能な文字列に含まれるアイテムの代わりに使用されます 'shark'.

新しいリストが何であるかを確認するために shark_letters のように、私たちはそれを求めます print() 次の出力を受け取ります。

Output
['s', 'h', 'a', 'r', 'k']

リスト内包表記で作成したリストは、文字列内の項目で構成されています 'shark'、つまり、文字ごとに1つの文字列。

リスト内包表記は次のように書き直すことができます for ループしますが、すべてではありません for ループはリスト内包として書き直すことができます。

を作成したリスト内包表記を使用して shark_letters 上記のリスト、それを次のように書き直してみましょう for ループ。 これは、リスト内包表記がどのように機能するかをよりよく理解するのに役立つ場合があります。

shark_letters = []

for letter in 'shark':
    shark_letters.append(letter)

print(shark_letters)

でリストを作成する場合 for ループの場合、リストに割り当てられた変数は、コードブロックの最初の行にあるため、空のリストで初期化する必要があります。 The for 次に、ループは変数を使用してアイテムを反復処理します letter 反復可能な文字列 'shark'. 以内 for ループの場合、文字列内の各項目は、list.append(x)メソッドを使用してリストに追加されます。

リスト内包表記を次のように書き直します for ループは同じ出力を提供します:

Output
['s', 'h', 'a', 'r', 'k']

リスト内包表記は次のように書き直すことができます for ループ、およびいくつか for ループをリスト内包表記に書き直して、コードをより簡潔にすることができます。

リスト内包表記での条件文の使用

リスト内包表記は、条件ステートメントを利用して、新しいリストを作成するときに既存のリストまたは他の順次データ型を変更できます。

の例を見てみましょう if リスト内包表記で使用されるステートメント:

fish_tuple = ('blowfish', 'clownfish', 'catfish', 'octopus')

fish_list = [fish for fish in fish_tuple if fish != 'octopus']
print(fish_list)

リスト内包表記はタプルを使用します fish_tuple と呼ばれる新しいリストの基礎として fish_list. のキーワード forin 上記のセクションにあったように、が使用されます。 if ステートメントが追加されます。 The if ステートメントは、文字列と同等ではないアイテムのみを追加するように指示します 'octopus'、したがって、新しいリストは、一致しないタプルからのアイテムのみを取り込みます 'octopus'.

これを実行すると、次のことに気付くでしょう。 fish_list と同じ文字列アイテムが含まれています fish_tuple 文字列が 'octopus' 省略されています:

Output
['blowfish', 'clownfish', 'catfish']

したがって、新しいリストには、条件ステートメントによって除外される文字列を除いて、元のタプルのすべての項目が含まれます。

数学演算子整数、および range()シーケンスタイプを使用する別の例を作成します。

number_list = [x ** 2 for x in range(10) if x % 2 == 0]
print(number_list)

作成中のリスト、 number_list、0〜9 if の範囲の各アイテムの値の二乗が、アイテムの値が2で割り切れる場合に入力されます。 出力は次のとおりです。

Output
[0, 4, 16, 36, 64]

リスト内包表記が何をしているのかをもう少し詳しく説明するために、電話をかけているだけの場合に何が出力されるかを考えてみましょう。 x for x in range(10). 小さなプログラムと出力は次のようになります。

number_list = [x for x in range(10)]
print(number_list)
Output
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

それでは、条件文を追加しましょう。

number_list = [x for x in range(10) if x % 2 == 0]
print(number_list)
Output
[0, 2, 4, 6, 8]

The if ステートメントは、最終リストの項目を2で割り切れる項目のみを含むように制限し、すべての奇数を省略しています。

最後に、それぞれを持つ演算子を追加できます x 二乗:

number_list = [x ** 2 for x in range(10) if x % 2 == 0]
print(number_list)

したがって、前のリストの各番号は [0, 2, 4, 6, 8] 今二乗されています:

Output
[0, 4, 16, 36, 64]

リスト内包表記を使用して、ネストされたifステートメントを複製することもできます。

number_list = [x for x in range(100) if x % 3 == 0 if x % 5 == 0]
print(number_list)

ここで、リスト内包表記は最初に番号が x は3で割り切れます。次に、 x 5で割り切れる。 もしも x 印刷する両方の要件を満たし、出力は次のとおりです。

Output
[0, 15, 30, 45, 60, 75, 90]

条件付き if ステートメントを使用して、既存のシーケンスのどのアイテムを新しいリストの作成に含めるかを制御できます。

リスト内包内のネストされたループ

ネストされたループを使用して、プログラムで複数の反復を実行できます。

今回は、既存のネストされたものを確認します for ループ構造を作成し、リスト内包に向けて作業します。

このコードは、2つのリストを繰り返し、それらに基づいて数学演算を実行する新しいリストを作成します。 これがネストされたものです for ループコードブロック:

my_list = []

for x in [20, 40, 60]:
	for y in [2, 4, 6]:
		my_list.append(x * y)

print(my_list)

このコードを実行すると、次の出力が返されます。

Output
[40, 80, 120, 80, 160, 240, 120, 240, 360]

このコードは、各反復で最初のリストの項目に2番目のリストの項目を乗算しています。

これをリスト内包表記に変換するために、コードの各行を1行に凝縮します。 x * y 手術。 これにアウターが続きます for ループ、次に内側 for ループ。 追加します print() 新しいリストがネストされたリストで作成したリストと一致することを確認するためのリスト内包表記の下のステートメント for 上記のループブロック:

my_list = [x * y for x in [20, 40, 60] for y in [2, 4, 6]]
print(my_list)
Output
[40, 80, 120, 80, 160, 240, 120, 240, 360]

私たちのリスト内包はネストされたものを取ります for ループして1行のコードにフラット化し、まったく同じリストを作成して割り当てます。 my_list 変数。

リスト内包表記は、リストを作成するための簡潔な方法を提供し、複数行のコードを1行に抽出できるようにします。 ただし、コードの可読性を常に優先する必要があるため、リスト内包表記の行が長くなりすぎたり扱いにくくなったりした場合は、ループに分割するのが最適な場合があります。

結論

リスト内包表記を使用すると、1つのリストまたは他のシーケンスを新しいリストに変換できます。 これらは、このタスクを完了するための簡潔な構文を提供し、コード行を制限します。

リスト内包表記は、集合の内包的表記法または集合の内包表記法の数学的形式に従うため、数学的なバックグラウンドを持つプログラマーにとって特に直感的である可能性があります。

リスト内包表記を使用するとコードをより簡潔にすることができますが、最終的なコードをできるだけ読みやすくすることが重要です。そのため、コードをユーザーフレンドリーにするために、非常に長い1行のコードは避けてください。