logo

Python でリストをフラット化する

はじめに

リスト Python プログラミング言語の中で最も柔軟なデータ構造の 1 つと考えられています。一方、2 次元リスト (2D List) は一般にリストのリストと呼ばれ、各要素がリストそのものであるリストのオブジェクトです。例: [[19, 18, 17]、[16, 15, 14]、[13, 12, 11]]。

リストのリストのフラット化は、リストのリストに保持されているすべてのリスト要素のネストを解除することによって、2 次元のリストを 1 次元のリストに変換するプロセスです。つまり、[[9, 8, 7], [6 を変換します。 、5、4]、[3、2、1]] ~ [9、8、7、6、5、4、3、2、1]。

ネストされたメソッドを使用して平坦化プロセスを実行できます。 のために ループ、再帰、リスト内包表記、コア関数、または入れ子になったリストの深さと規則性に関する Python でのライブラリまたはパッケージのインポート。

このチュートリアルでは、Python プログラミング言語を使用してネストされたリストをフラット化するためのさまざまな方法を検討します。ただし、始める前に、ネストされたリストの種類を理解しましょう。

ネストされたリストにはどのような種類がありますか?

みなさんご存じのとおり、 パイソン は弱い型付けのプログラミング言語です。したがって、2 種類のリストのリストに遭遇する可能性があります。これらのリストのリストまたはネストされたリストは次のとおりです。

  1. 通常のリストのリスト
  2. 不規則なリストのリスト

通常のリストのリスト

リストの通常リスト内の各項目はサブリストと呼ばれ、したがって要素の型の均一性が観察されます。例: [[9, 8, 7], [6, 5, 4], [3, 2, 1]] は、[9, 8, 7]、[6, 5, 4] のようなリストの通常のリストです。 , [3, 2, 1]はリスト型です。

不規則なリストのリスト

ブースアルゴリズム

リストの不規則リスト内の各項目は、サブリストまたは非リスト要素 (文字列や整数など) と呼ばれます。このように、素子の種類にばらつきがある。例: [[9, 8, 7], [6, 5], 4, 3] は、[9, 8, 7] と [6, 5] がリスト型であるのに対し、4 はリストの不規則なリストです。 3 つは int 型です。

ネストされた for ループを使用したリストのリストのフラット化

ネストされたリストのリストをフラット化する のために Loops の助けは、フラット リストを取得するための強引なアプローチであると考えられています。この方法は、2 次元リストから各項目を選択し、1 次元リストに配置することで実行できます。

規則的なリストと不規則なリストの両方で機能する次の例を考えてみましょう。

例:

 # defining the function def flattenlist(_2dlist): # defining an empty list flatlist = [] # Iterating through the outer list for item in _2dlist: if type(item) is list: # If the item is of the list type, iterating through the sub-list for element in item: flatlist.append(element) else: flatlist.append(item) return flatlist # defining the nested list nestedlist = [[10, 20, 30, 40], [50, 60, 70], [80, 90, 100]] print('Genuine List:', nestedlist) print('Converted Flat List:', flattenlist(nestedlist)) 

出力:

 Genuine List: [[10, 20, 30, 40], [50, 60, 70], [80, 90, 100]] Converted Flat List: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100] 

説明:

上の例では、関数を次のように定義しました。 フラットテンリスト それはパラメータを次のように受け取ります _2dlist 。それから私たちは使用しました のために ループを使用して、ネストされたリストの要素を反復し、それらを追加してフラット化されたリストを生成します。次に、ネストされたリストを定義し、 フラットテンリスト 関数。その結果、ネストされたリストはフラット化されたリストに正常に変換されました。

リスト内包表記を使用したネストされたリストのフラット化

リスト内包表記を使用してリストのリストをフラット化することは、2 次元の既存のリストに基づいてフラットなリストを取得するための洗練されたアプローチであると考えられます。ただし、このアプローチでは、あまり直感的ではないソリューションが提供されます。

次の例を考えてみましょう。

例:

 # defining the nested list nestedlist = [[10, 20, 30, 40], [50, 60, 70], [80, 90]] # list comprehension flatlist = [element for sub_list in nestedlist for element in sub_list] print('Genuine list:', nestedlist) print('Converted list:', flatlist) 

出力:

 Genuine list: [[10, 20, 30, 40], [50, 60, 70], [80, 90]] Converted list: [10, 20, 30, 40, 50, 60, 70, 80, 90] 

説明:

上の例では、ネストされたリストとリスト内包表記を定義しました。その後、ユーザー向けに印刷しました。その結果、ネストされたリストはフラット化されたリストに正常に変換されました。

再帰的メソッドを使用したリストのリストのフラット化

再帰的方法を使用して、2 次元リストを平坦化することもできます。リストのリストをフラット化するために再帰的メソッドを実装する次の例を考えてみましょう。この実装は、リストの規則的なリストだけでなく、不規則なリストにもうまく機能します。

例:

 # defining a function def flattenlist(nestedlist): if len(nestedlist) == 0: return nestedlist if isinstance(nestedlist[0], list): return flattenlist(nestedlist[0]) + flattenlist(nestedlist[1:]) return nestedlist[:1] + flattenlist(nestedlist[1:]) print(flattenlist([[10, 20, 30, 40], [50, 60, 70], [80, 90], 100])) 

出力:

 [10, 20, 30, 40, 50, 60, 70, 80, 90, 100] 

説明:

上の例では、関数を定義し、 もし 声明 ネストされたリストの長さがゼロに等しいかどうかを示し、ネストされたリストを返します。

Javaのコレクション

0 番目のインデックスのデータ要素がリストのインスタンスである場合、リスト インデックスは再び関数に入り、リストの次のインデックスに追加されます。それ以外の場合、関数は要素などを返します。最後に、ネストされたリストを定義し、関数を実行しました。その結果、リストのリストは再帰的に平坦化されました。

Pythonのライブラリを利用する

Python プログラミング言語ライブラリの一部を利用して、リストのリストをフラット化することもできます。これらのライブラリの実装については以下で説明します。

functool と演算子ライブラリを使用したリストのリストのフラット化

オペレーター ライブラリが提供するのは、 アイコンキャット() 連結などの基本的な操作を実行する関数。この関数をネストされたリストのデータ要素に左から右に累積的に適用すると、ネストされたリストがフラット化されたリストに縮小されます。

その実装を理解するために次の例を考えてみましょう。

例:

 # importing the required libraries import operator import functools regularlist = [] # Converting the list of lists into a flattened one. def convo(nestedlist): for element in nestedlist: if type(element) is list: regularlist.append(element) else: regularlist.append([element]) return regularlist twoDlist = [[10, 20, 30, 40], [50, 60, 70], [80, 90, 100], 110] regular2Dlist = convo(twoDlist) print('Given List:', twoDlist) print('Converted list:', functools.reduce(operator.iconcat, regular2Dlist, [])) 

出力:

Javaのリスト
 Given List: [[10, 20, 30, 40], [50, 60, 70], [80, 90, 100], 110] Converted list: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110] 

説明:

上の例では、 関数ツール 図書館と一緒に オペレーター 図書館。次に、空のリストを次のように定義しました。 定期リスト 。次に関数を次のように定義しました。 コンボ リストのリストをフラット化されたリストに変換します。この関数では、 のために このループでは、ネストされたリストの要素が、前に定義した空のリストに追加されます。後で、ネストされたリストを定義し、関数を実行します。その結果、リストのリストはフラット化されたリストに正常に変換されます。

itertools ライブラリを使用したリストのリストのフラット化

イターツール ライブラリが提供するのは、 鎖() この関数を使用すると、ネストされたリストを単一のフラット化されたリストに理想的に変換できます。この関数は、パラメーターとして渡された反復可能オブジェクトを介して連続するシリーズをシリアル方式で反復することにより、連続したシリーズを単一のシリーズとして扱います。

次の例を考えてみましょう。

例:

 # importing the itertools library import itertools # defining the nested list nestedlist = [[10, 20, 30, 40], [50, 60, 70], [80, 90, 100]] flattenlist = list(itertools.chain(*nestedlist)) print('The nested list:', nestedlist) print('The flattened list:', flattenlist 

出力:

 The nested list: [[10, 20, 30, 40], [50, 60, 70], [80, 90, 100]] The flattened list: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100] 

説明:

上の例では、 イターツール ライブラリを作成し、ネストされたリストを生成しました。次に使用したのは、 鎖() 指定されたネストされたリストをフラット化されたリストに変換する関数。ついにその結果をユーザーに還元しました。その結果、リストのリストは正常にフラット化されます。

NumPy ライブラリを使用したリストのリストのフラット化

ナムピー ライブラリは、列方向または行方向の 2 次元の規則的な配列の連結を含む、さまざまな日常的な操作を提供します。として知られる属性を使用します。 フラット ターゲットを征服するために配列上の 1 次元イテレータを取得するために。 concatenate 関数と flat 属性の使用法を理解するために、次の例を考えてみましょう。

例:

 # importing the library import numpy # defining the nested list nestedlist = [[10, 20, 30, 40], [50, 60, 70], [80, 90]] # using the concatenate function along with the flat attribute flattenlist = list(numpy.concatenate(nestedlist).flat) print('The Nested list:', nestedlist) print('The Flattened list:', flattenlist) 

出力:

 The Nested list: [[10, 20, 30, 40], [50, 60, 70], [80, 90]] The Flattened list: [10, 20, 30, 40, 50, 60, 70, 80, 90] 

説明:

上の例では、 しこり ライブラリを作成し、ネストされたリストを定義しました。次に使用したのは、 連結する の機能 しこり ライブラリとその フラット 属性を使用して、ネストされたリストの要素をフラット化し、それらを新しいフラット化されたリストに連結します。最後に、結果をユーザーに出力しました。したがって、リストのリストは正常にフラット化されます。

コア機能の活用

Python プログラミング言語が提供するいくつかのコア関数を利用して、平坦化タスクを実行することもできます。

nginx変数

sum 関数を使用したリストのリストのフラット化

この問題の別の解決策として、内部リストの合計を検討できます。 2 つの引数を 関数: 最初のパラメータは 反復可能な これはネストされたリストであり、2 番目のパラメータは次のとおりです。 始める これは、次の場合の無効なリストで、内部サブリストのデータ要素が追加される最初のフラット リストとして機能します。

このアプローチは何もインポートする必要がないため、非常に便利であると言えます。ただし、より遅いです。 itertools() そして 鎖() ネストされたリストに多数のサブリストが存在する場合に機能します。

次の例を考えてみましょう。

例:

 # defining a nested list nestedlist = [[10, 20, 30, 40], [50, 60, 70], [80, 90]] # using the sum function flattenlist = sum(nestedlist, []) print('The Nested list:', nestedlist) print('The Flattened list:', flattenlist) 

出力:

 The Nested list: [[10, 20, 30, 40], [50, 60, 70], [80, 90]] The Flattened list: [10, 20, 30, 40, 50, 60, 70, 80, 90] 

説明:

上の例では、ネストされたリストを定義しました。次に使用したのは、 和() 関数を使用して、ネストされたリストを 1 次元リストに平坦化し、結果のリストをユーザーに出力します。その結果、リストのリストをフラット リストに変換することに成功しました。

Lambda キーワードを使用したリストのリストのフラット化

キーワードを使用して無名関数を定義できます。 ラムダ 。この匿名関数にパラメータとして正規/不規則リストを渡すことができます。式の評価は、フラットな 1 次元リストを取得するために行われます。

次の例を考えてみましょう。

例:

 # Defining the nested list nestedlist = [[10, 20, 30], [30, 50, 60], [40, 60, 70], 70] # Using lambda parameters: expression flattenlist = lambda nestedlist:[item for element in nestedlist for item in flattenlist(element)] if type(nestedlist) is list else [nestedlist] print('The Nested list:', nestedlist) print('The Flattened List:', flattenlist(nestedlist)) 

出力:

 The Nested list: [[10, 20, 30], [30, 50, 60], [40, 60, 70], 70] The Flattened List: [10, 20, 30, 30, 50, 60, 40, 60, 70, 70] 

説明:

上の例では、ネストされたリストを定義しました。次に使用したのは、 ラムダ キーワードと引数を組み合わせて、リスト内包の式を定義します。その後、ユーザー向けに印刷しました。その結果、二次元の不規則リストを平坦化されたリストに変換することに成功しました。