的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
,不是單純的發電機,你'd想要做
[list(gen()) for gen in generator_of_generator_functions]
如果這不起作用,我不知道你在問什麼。另外,它爲什麼會返回一個生成器函數而不是生成器本身?
自從你說你想避免list(generator_of_generator_functions)
從神祕崩潰的評論,這取決於你真正想要的。
例如,
def metagen():
def innergen():
yield 1
yield 2
yield 3
for i in range(3):
r = innergen()
yield r
for _ in r: pass
- 或者使用的是深色的,祕密的破解方法,我將展示在莫」(我需要寫),但不這樣做!
如所承諾的,黑客(對於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
類,併爲它的所有方法添加陰影,這只是另一層粗糙。
基本上,請不要使用這個黑客。不過,你可以盡情享受它。
您是否嘗試過使用readline。通過這種方式只讀取單行的行;由新行分隔。這是在內存中加載小數據的好方法,除非你的線路本身很大。 – Vivek
@Vivek我的線條非常複雜,我們每個線條都會生成一個驗證線條的對象,其狀態也取決於以前的線條。向用戶公開文件的內部格式不是一種選擇。 – crusaderky
你可以給一個樣本輸入行... – Vivek