のPython 2:
map(list, generator_of_generators)
のPython 3:
list(map(list, generator_of_generators))
またはその両方のために:
[list(gen) for gen in generator_of_generators]
生成されたオブジェクトは、単なる発電機generator functions
ではありませんので、あなたはやりたいと思ったのです
[list(gen()) for gen in generator_of_generator_functions]
これが機能しない場合、私はあなたが何を求めているのか分かりません。また、ジェネレータ関数ではなく、ジェネレータ自体を返すのはなぜですか?あなたは不思議にクラッシュからlist(generator_of_generator_functions)
を避けたかったと述べたコメントの中で、これはあなたが本当に欲しいものに依存しているので
。
このようにlist
の振る舞いを上書きすることはできませんです:どちらかサブ発電要素またはあなたが本当にクラッシュを取得した場合は、私は排気お勧めしませを
保存しますメインジェネレータが繰り返し実行されるたびにメインジェネレータループを持つサブジェネレータ。これは標準的な練習であり、まさにitertools.groupby
が何をするのですか、stdlib generator-of-generatorsです。
例えば、
、ハック(Pythonの3のために、この時間「ラウンド)約束通り:
from collections import UserList
from functools import partial
def objectitemcaller(key):
def inner(*args, **kwargs):
try:
return getattr(object, key)(*args, **kwargs)
except AttributeError:
return NotImplemented
return inner
class Listable(UserList):
def __init__(self, iterator):
self.iterator = iterator
self.iterated = False
def __iter__(self):
return self
def __next__(self):
self.iterated = True
return next(self.iterator)
def _to_list_hack(self):
self.data = list(self)
del self.iterated
del self.iterator
self.__class__ = UserList
for key in UserList.__dict__.keys() - Listable.__dict__.keys():
if key not in ["__class__", "__dict__", "__module__", "__subclasshook__"]:
setattr(Listable, key, objectitemcaller(key))
def metagen():
def innergen():
yield 1
yield 2
yield 3
for i in range(3):
r = Listable(innergen())
yield r
if not r.iterated:
r._to_list_hack()
else:
for item in r: pass
for item in metagen():
print(item)
print(list(item))
#>>> <Listable object at 0x7f46e4a4b850>
#>>> [1, 2, 3]
#>>> <Listable object at 0x7f46e4a4b950>
#>>> [1, 2, 3]
#>>> <Listable object at 0x7f46e4a4b990>
#>>> [1, 2, 3]
list(metagen())
#>>> [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
それは、私もそれを説明する必要はありませんので、悪いです。
重要な点は、反復処理が行われているかどうかを検出できるラッパーがあることです。_to_list_hack
を実行していないと、__class__
属性が変更されます。
矛盾したレイアウトのため、UserList
クラスを使用し、すべてのメソッドをシャドーする必要があります。これは、crudの別のレイヤーです。
基本的には、このハッキングを使用しないでください。あなたはユーモアとしてそれを楽しむことができます。
readlineでの作業を試したことがありますか?このようにして、1行の行だけが読み込まれます。新しいラインで区切られています。これは、ライン自体が巨大でない限り、小さなデータをメモリに読み込むための良い方法です。 – Vivek
@Vivek私の行は非常に複雑で、そのそれぞれから、その行を検証し、その状態が前の行にも依存するオブジェクトを生成します。ファイルの内部形式をユーザーに公開することはオプションではありません。 – crusaderky
サンプル入力行を与えることができます... – Vivek