Pythonでリストの展開

http://www.josw.net/blog/?p=987

bigramの計算するために、リストを展開しまくるジェネレータな関数作った。

[0, 1, 2, 3]

のようなリストは普通にfor文で中身を読めばいいし、

[[1,2,3], [4,5,6], [7,8,9]]

みたいな退屈なリストなら多重ループでいいし。

そうじゃなくて、

[[0], 1, [2,[3,4],[5,[6,7,[8]],9]], [10,11,[12,[13,[14,[15,16]], 17], 18,19]], 20, 21]

みたいな、いわゆる木構造的なリストを順番に読み込むのってめんどくさい。

こんなリストを、next()するたびに0, 1, 2, 3, …. 20, 21と順番に返してくれると便利かなぁと。

というわけで作ってみたんで置いときます。

ちなみに、再帰を使って実装してるんで、リストのネスト(!)が深すぎるとRuntimeError: maximum recursion depth exceededが出ちゃいます。

といっても1000くらいは大丈夫みたいですが。


def list_openner(list):
import types
for value in list:
if type(value) == types.ListType:
for next_value in list_openner(value):
yield next_value
else:
yield value