Python – リスト内包表記
Python リスト内包表記は、式を含む括弧で構成されます。この式は、Python リスト内の各要素を反復するための for ループとともに要素ごとに実行されます。
例:
パイソン
numbers> => [> 12> ,> 13> ,> 14> ,]> doubled> => [x> *> 2> for> x> in> numbers]> print> (doubled)> |
出力
[24, 26, 28]
Python リスト内包構文
構文: 新しいリスト = [ 式(要素) のために 要素 で 古いリスト もし 状態 ]
パラメータ:
式 : 反復可能内のすべての項目に対して実行する操作を表します。 element : 変数という用語は、反復可能オブジェクトから取得された各値を指します。 iterable : 反復処理する要素のシーケンスを指定します (リスト、タプル、文字列など)。条件: (オプション) フィルターは、要素を新しいリストに追加するかどうかを決定するのに役立ちます。
戻る: リスト内包表記の戻り値は、指定された基準を満たす変更された要素を含む新しいリストです。
Python のリスト内包表記では、既存のリストの値に基づいて新しいリストを作成するための、より短い構文が提供されます。
Python でのリスト内包の例
以下は、Python でリスト内包表記を使用して数値の 2 乗を求める例です。
パイソン
numbers> => [> 1> ,> 2> ,> 3> ,> 4> ,> 5> ]> squared> => [x> *> *> 2> for> x> in> numbers]> print> (squared)> |
出力
[1, 4, 9, 16, 25]
リスト内包表記による反復
この例では、リストに 1、2、および 3 を割り当て、リスト内包表記を使用してリストを出力します。
パイソン
# Using list comprehension to iterate through loop> List> => [character> for> character> in> [> 1> ,> 2> ,> 3> ]]> > # Displaying list> print> (> List> )> |
出力
[1, 2, 3]
リスト内包表記を使用した偶数リスト
この例では、リスト内包表記を使用して 0 から 10 までの偶数を出力しています。
パイソン
list> => [i> for> i> in> range> (> 11> )> if> i> %> 2> => => 0> ]> print> (> list> )> |
出力
[0, 2, 4, 6, 8, 10]
リスト内包表記を使用した行列
この例では、行列の 0 ~ 2 ~ 3 行の整数を割り当て、リスト内包表記を使用して出力します。
パイソン
matrix> => [[j> for> j> in> range> (> 3> )]> for> i> in> range> (> 3> )]> > print> (matrix)> |
出力
[[0, 1, 2], [0, 1, 2], [0, 1, 2]]
リスト内包表記と For ループの比較
リストを反復するにはさまざまな方法があります。ただし、最も一般的なアプローチは、 のために ループ 。以下の例を見てみましょう。
パイソン
# Empty list> List> => []> > # Traditional approach of iterating> for> character> in> 'Geeks 4 Geeks!'> :> > List> .append(character)> > # Display list> print> (> List> )> |
出力
['G', 'e', 'e', 'k', 's', ' ', '4', ' ', 'G', 'e', 'e', 'k', 's', '!']
上記は、リスト、文字列、タプルなどを反復処理する従来のアプローチの実装です。Python のリスト内包では同じタスクが実行され、プログラムもより単純になります。
リスト内包表記は、従来の反復アプローチを次のように変換します。 for ループ シンプルな式にまとめられているので使いやすいです。以下は、Python のリスト内包表記を使用してリスト、文字列、タプルなどを反復処理するアプローチです。
パイソン
# Using list comprehension to iterate through loop> List> => [character> for> character> in> 'Geeks 4 Geeks!'> ]> > # Displaying list> print> (> List> )> |
出力
['G', 'e', 'e', 'k', 's', ' ', '4', ' ', 'G', 'e', 'e', 'k', 's', '!']
リスト内包表記とループにおける時間分析
Python のリスト内包表記は、for a ループよりも計算の面でも、コーディングのスペースと時間の面でも効率的です。通常、これらは 1 行のコードで記述されます。以下のプログラムは、ループとリスト理解の違いをパフォーマンスに基づいて示しています。
パイソン
# Import required module> import> time> > > # define function to implement for loop> def> for_loop(n):> > result> => []> > for> i> in> range> (n):> > result.append(i> *> *> 2> )> > return> result> > > # define function to implement list comprehension> def> list_comprehension(n):> > return> [i> *> *> 2> for> i> in> range> (n)]> > > # Driver Code> > # Calculate time taken by for_loop()> begin> => time.time()> for_loop(> 10> *> *> 6> )> end> => time.time()> > # Display time taken by for_loop()> print> (> 'Time taken for_loop:'> ,> round> (end> -> begin,> 2> ))> > # Calculate time takens by list_comprehension()> begin> => time.time()> list_comprehension(> 10> *> *> 6> )> end> => time.time()> > # Display time taken by for_loop()> print> (> 'Time taken for list_comprehension:'> ,> round> (end> -> begin,> 2> ))> |
出力
Time taken for_loop: 0.39 Time taken for list_comprehension: 0.35
上記のプログラムから、リスト内包表記は for ループよりもかなり高速であることがわかります。
入れ子になったリストの内包表記
入れ子になったリストの内包表記 これは、ネストされた for ループによく似た、別のリスト内包表記内のリスト内包表記に他なりません。以下はネストされたループを実装するプログラムです。
パイソン
matrix> => []> > for> i> in> range> (> 3> ):> > > # Append an empty sublist inside the list> > matrix.append([])> > > for> j> in> range> (> 5> ):> > matrix[i].append(j)> > print> (matrix)> |
出力
[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]
ネストされたリスト内包表記を使用することで、より少ないコード行で同じ出力を生成できるようになりました。
パイソン
# Nested list comprehension> matrix> => [[j> for> j> in> range> (> 5> )]> for> i> in> range> (> 3> )]> > print> (matrix)> |
出力
[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]
リスト内包表記とラムダ
ラムダ式 は、Python 関数の短縮表現にすぎません。ラムダでリスト内包表記を使用すると、効率的な組み合わせが作成されます。以下の例を見てみましょう。
この例では、リストに 10 から 50 までの数字を挿入して印刷しています。
パイソン
# using lambda to print table of 10> numbers> => []> > for> i> in> range> (> 1> ,> 6> ):> > numbers.append(i> *> 10> )> > print> (numbers)> |
出力
[10, 20, 30, 40, 50]
ここでは、for ループを使用して 10 のテーブルを出力しています。
パイソン
numbers> => [i> *> 10> for> i> in> range> (> 1> ,> 6> )]> > print> (numbers)> |
出力
[10, 20, 30, 40, 50]
ここでは、リスト内包表記のみを使用して 10 の表を表示しています。
パイソン
# using lambda to print table of 10> numbers> => list> (> map> (> lambda> i: i> *> 10> , [i> for> i> in> range> (> 1> ,> 6> )]))> > print> (numbers)> |
出力
[10, 20, 30, 40, 50]
最後に、ラムダ + リスト内包表記を使用して 10 の表を表示します。この組み合わせは、複雑な問題に対して、より少ないコード行で効率的な解決策を得るのに非常に役立ちます。
リスト内包表記の条件文
リスト内包表記に条件ステートメントを追加することもできます。を使用してリストを作成できます 範囲()、 演算子 など、および cal も、 if ステートメント 。
キーポイント
- リストを理解することは、現在のリストに基づいてリストを記述および構築する効果的な手段です。
- 一般に、リスト理解は軽量で、標準のリスト形成関数やループよりも単純です。
- ユーザーフレンドリーなコードを保証するために、リスト内包表記の長いコードを記述すべきではありません。
- リストのすべての内包は for ループで書き換えることができますが、リスト解釈のコンテキストではすべての for ループを書き換えることはできません。
以下に、iterable を反復する従来のアプローチではなく、リスト内包表記の使用を示すいくつかの例を示します。
If-else を使用した Python リストの内包表記。
この例では、0 から 7 までの数値が偶数であることを確認し、それを挿入します。 偶数 リストにそうでない場合は挿入 奇数 リストに。
パイソン
lis> => [> 'Even number'> if> i> %> 2> => => 0> > else> 'Odd number'> for> i> in> range> (> 8> )]> print> (lis)> |
出力
['Even number', 'Odd number', 'Even number', 'Odd number', 'Even number', 'Odd number', 'Even number', 'Odd number']
リスト内包表記を使用した入れ子 IF
この例では、リストに 10 ~ 100 の倍数の数字を挿入して出力しています。
パイソン
lis> => [num> for> num> in> range> (> 100> )> > if> num> %> 5> => => 0> if> num> %> 10> => => 0> ]> print> (lis)> |
出力
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
1 から 10 までの数字の四角形を表示します
この例では、リストに 1 から 10 までの四角形を挿入し、リストを印刷しています。
パイソン
# Getting square of number from 1 to 10> squares> => [n> *> *> 2> for> n> in> range> (> 1> ,> 11> )]> > # Display square of even numbers> print> (squares)> |
出力
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
2D行列の転置表示
この例では、リスト内包表記を使用して行列の転置を行っています。
パイソン
# Assign matrix> twoDMatrix> => [[> 10> ,> 20> ,> 30> ],> > [> 40> ,> 50> ,> 60> ],> > [> 70> ,> 80> ,> 90> ]]> > # Generate transpose> trans> => [[i[j]> for> i> in> twoDMatrix]> for> j> in> range> (> len> (twoDMatrix[> 0> ]))]> > print> (trans)> |
出力
[[10, 40, 70], [20, 50, 80], [30, 60, 90]]
文字列内の各文字の大文字と小文字を切り替える
この例では、32 の XOR 演算子を使用して、指定された文字列内の各文字の大文字と小文字を切り替え、結果をリストに保存します。
パイソン
# Initializing string> string> => 'Geeks4Geeks'> > # Toggle case of each character> List> => list> (> map> (> lambda> i:> chr> (> ord> (i) ^> 32> ), string))> > # Display list> print> (> List> )> |
出力
['g', 'E', 'E', 'K', 'S', 'x14', 'g', 'E', 'E', 'K', 'S']
タプル内の各文字列を反転します
この例では、for ループ内の文字列を反転してリストに挿入し、リストを出力します。
パイソン
# Reverse each string in tuple> List> => [string[::> -> 1> ]> for> string> in> (> 'Geeks'> ,> 'for'> ,> 'Geeks'> )]> > # Display list> print> (> List> )> |
出力
['skeeG', 'rof', 'skeeG']
2 つの別々のリストからタプルのリストを作成する
この例では、次の 2 つのリストを作成しました。 名前も年齢も。 私たちが使用しているのは ジップ() リスト内包表記では、名前と年齢をタプルとしてリストに挿入しています。最後に、タプルのリストを出力します。
パイソン
names> => [> 'G'> ,> 'G'> ,> 'g'> ]> ages> => [> 25> ,> 30> ,> 35> ]> person_tuples> => [(name, age)> for> name, age> in> zip> (names, ages)]> print> (person_tuples)> |
出力:
[('G', 25), ('G', 30), ('g', 35)] リスト内のすべての奇数要素の桁の合計を表示します。
この例では、リストを作成し、リスト内のすべての奇数要素の桁の合計を求めています。
パイソン
# Explicit function> def> digitSum(n):> > dsum> => 0> > for> ele> in> str> (n):> > dsum> +> => int> (ele)> > return> dsum> > > # Initializing list> List> => [> 367> ,> 111> ,> 562> ,> 945> ,> 6726> ,> 873> ]> > # Using the function on odd elements of the list> newList> => [digitSum(i)> for> i> in> List> if> i &> 1> ]> > # Displaying new list> print> (newList)> |
出力
[16, 3, 18, 18]
リスト内包表記の利点
- ループよりも時間とスペースの効率が高くなります。
- 必要なコード行が少なくなります。
- 反復ステートメントを数式に変換します。
Python リスト理解演習問題
以下は、Python のリスト理解に関する 2 つの練習問題です。数値の 3 乗を見つけるための基本的なリスト内包表記コードと、リスト内包表記と len() 関数を使用して単語の長さを見つけるコードについて説明しました。
Q1. リスト内包表記を使用した数値の立方体演習問題
パイソン
numbers> => [> 1> ,> 2> ,> 3> ,> 4> ,> 5> ,> 6> ,> 7> ,> 8> ,> 9> ,> 10> ]> cube> => [number> *> *> 3> for> number> in> numbers]> print> (cube)> |
出力
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]
Q2. リスト内包表記を使用して語長の練習問題を見つける
パイソン
words> => [> 'apple'> ,> 'banana'> ,> 'cherry'> ,> 'orange'> ]> word_lengths> => [> len> (word)> for> word> in> words]> print> (word_lengths)> |
出力
[5, 6, 6, 6]