Pythonでネストされたリストをフラット化するイテレータの実装方法
整数が入れ子になったリスト(ネストされたリスト)があるとします。このリストを平坦化(フラット化)するためのイテレータを実装する必要があります。各要素は整数、またはリストのいずれかであり、そのリストの要素もまた整数や別のリストである可能性があります。
例えば、入力が [[1, 1], 2, [1, 1]] の場合、出力は [1, 1, 2, 1, 1] のようになります。
解決のアプローチ
この問題を解くためには、以下の手順に従います。
- 初期化処理: コンストラクタでネストされたリストを受け取り、結果を格納するための空のリスト
resとインデックスindex = 0を用意し、再帰関数getVal()を呼び出します。 - getVal() メソッド: ネストされたリストを受け取り、その要素を順番に走査します。要素が整数であれば
resリストに追加し、リストであれば自分自身を再帰的に呼び出してさらに展開します。 - next() メソッド: 現在のインデックスが指す値を返し、インデックスを1つ進めます。
- hasNext() メソッド: 次に返すべき要素が存在する場合は
Trueを、存在しない場合はFalseを返します。
Pythonでの実装例
以下の実装を見ると、より理解しやすくなります。
class NestedIterator(object):
def __init__(self, nestedList):
self.res = []
self.index = 0
self.getVal(nestedList)
#print(self.res)
def getVal(self,NestedList):
for item in NestedList:
if isinstance(item, int):
self.res.append(item)
else:
self.getVal(item)
def next(self):
self.index+=1
return self.res[self.index-1]
def hasNext(self):
if self.index == len(self.res):
return False
return True
ob = NestedIterator([[1,1],2,[1,1]])
while ob.hasNext():
print(ob.next())入力
[[1,1],2,[1,1]]
出力
1 1 2 1 1
実装のポイント
このアプローチでは、isinstance() 関数を使って要素が整数かどうかを判定しています。整数であればそのまま結果リストに追加し、リスト型であれば再帰的に処理を続けることで、どれだけ深くネストされた構造でも正しくフラット化できます。
なお、この方法は初期化時にすべての要素を展開してしまうため、データ量が非常に大きい場合にはメモリ使用量に注意が必要です。そのようなケースでは、ジェネレータやスタックを使った遅延評価方式の実装も検討するとよいでしょう。
-
Pythonのイテレータ関数とは?基本の仕組みとカスタムイテレータの作り方を解説
Pythonにおけるイテレータ(Iterator)とは、反復処理プロトコル(イテレーションプロトコル)を実装したオブジェクトのことです。リスト、タプル、セットなどの標準的なデータ構造は、あらかじめイテレータとして動作するように作られているため、組み込みイテレータと呼ばれます。イテレータを自作する場合、反復処理プロトコルに含まれる2つの特別なメソッドを実装する必要があります。それぞれの役割を詳しく見ていきましょう。反復処理プロトコルを構成する2つのメソッド1. __iter__() メソッド__iter__() は、イテレータオブジェクトを初期化するときに呼び出されるメソッドです。このメソッドは
-
Pythonでネストしたリスト(浅いリスト)をフラット化する方法
Pythonでは、リストの中にリストが入った「入れ子(ネスト)構造」のデータを、1次元のフラットなリストに変換したい場面がよくあります。この記事では、浅い階層のリストをフラット化する代表的な方法を、具体的なコード例とともに紹介します。 方法1:ネストしたforループを使う 最もシンプルで直感的なのは、2重のforループを使ってサブリストから要素を1つずつ取り出し、空のリストへ順番に追加していく方法です。処理の流れが分かりやすいため、Python初心者にもおすすめのアプローチです。 lst = [[10, 20, 30, 40], [50, 60, 70, 80], [90, 100, 110