Pythonでネストされたリストの各開始インデックスを取得する方法
Pythonでは、ネストされたリスト(リストの中にリストが入った構造)を扱う際、各サブリストが元のリスト全体の中でどの位置から始まるのか、その「開始インデックス」を求めたいケースがあります。本記事では、シンプルな反復処理と append メソッドを組み合わせて、この問題を解決する方法を解説します。
実装例
以下に具体的なコード例を示します。
my_list = [[51], [91, 22, 36, 44], [25, 25], [46, 67, 78, 82, 69, 29], [7, 5]]
print("元のリスト:")
print(my_list)
my_result = []
my_len = 0
for sub in my_list:
my_result.append(my_len)
my_len += len(sub)
print("各サブリストの開始インデックス:")
print(my_result)出力結果
元のリスト: [[51], [91, 22, 36, 44], [25, 25], [46, 67, 78, 82, 69, 29], [7, 5]] 各サブリストの開始インデックス: [0, 1, 5, 7, 13]
処理の流れと解説
まず、複数のサブリストを含むリスト(リストのリスト)を定義し、コンソールに表示します。
次に、結果を格納するための空のリスト
my_resultを用意し、累積カウント用の整数変数my_lenを 0 で初期化します。for ループで元のリストを順番に走査し、その時点での
my_lenの値(=現在のサブリストの開始位置)を空のリストに追加します。ループ内で、処理済みのサブリストの要素数だけ
my_lenを加算することで、次のサブリストの開始インデックスを正しく追跡できます。すべての走査が終わった時点で、
my_resultには各サブリストの開始インデックスが格納されており、これが最終的な結果となります。最後に、結果をコンソールに出力して表示します。
補足:itertools.accumulate を使った別のアプローチ
標準ライブラリの itertools.accumulate を使えば、同じ処理をより簡潔に書くこともできます。各サブリストの長さを先頭から順に累積加算し、最初に 0 を付加する方法です。
from itertools import accumulate my_list = [[51], [91, 22, 36, 44], [25, 25], [46, 67, 78, 82, 69, 29], [7, 5]] result = [0] + list(accumulate(len(sub) for sub in my_list[:-1])) print(result) # 出力: [0, 1, 5, 7, 13]
このように、ネストされたリストの開始インデックスは、基本的なループ処理でも、関数型スタイルのユーティリティを使っても簡単に求められます。データのフラット化や区間管理など、さまざまな場面で応用できるテクニックです。
-
Pythonでリスト内の要素のインデックスを取得する方法
index()メソッドで最初の出現位置を取得する リスト(文字列やタプルなど、他のシーケンス型でも同様)に用意されている index() メソッドを使うと、特定の要素が最初に出現する位置(インデックス)を簡単に見つけることができます。 >>> L1=[a, b, c, a, x] >>> L1 [a, b, c, a, x] >>> L1.index(a) 0 この例では、リスト L1 の中で a が最初に出現するのはインデックス 0 の位置であるため、0 が返されます。なお、指定した要素がリスト内に存在しない場合は ValueError
-
Pythonリスト入門:作成から操作、削除まで徹底解説
このチュートリアルでは、Pythonのリスト(List)について学びます。リストの作成方法、要素へのアクセス、要素の追加・削除、リスト自体の削除など、基本的な操作を一つずつ丁寧に解説していきます。 Pythonでは、リストは角括弧 [] を使って構築し、各要素はカンマ , で区切って記述します。 Pythonのリストは、異なる型のオブジェクトを混在させて格納できるのが特徴です。すべて文字列である必要も、整数である必要もありません。例えば、以下のように複数の型が混ざったリストを作成できます。mixedTypesList = [a, True, 1, 1.0] リストの作成方法 リストは、角括弧