我想知道如何编写python函数,它可以扁平化生成器产生另一个生成器或iteables (这也可以产生另一个生成器/迭代器…可能是无限的)。
下面是一个例子:
gen(gen(1,2,3), gen(4,5,6), [7,8,9], [gen(10,11,12), gen(13,14,15)])
注意:gen
-表示生成器对象,gen
后面括号之间的内容是将生成器gen
生成的数据。
“扁平化”后的预期结果:gen(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)
扁平化函数也有必要返回生成器!(因为否则,以前使用生成器将是毫无意义的)。
需要注意的是,我使用的是python 3。
谢谢!
发布于 2012-07-16 19:21:40
最简单的方法是递归展平函数。假设您想要深入到除字符串之外的所有可迭代对象,您可以这样做:
def flatten(it):
for x in it:
if (isinstance(x, collections.Iterable) and
not isinstance(x, str)):
for y in flatten(x):
yield y
else:
yield x
从Python 3.3开始,您还可以编写
def flatten(it):
for x in it:
if (isinstance(x, collections.Iterable) and
not isinstance(x, str)):
yield from flatten(x)
else:
yield x
发布于 2012-07-16 20:20:46
非递归方法本质上是递归方法的展开,使用堆栈:
def flatten(it):
stack = []
it = iter(it)
while True:
try:
x = next(it)
except StopIteration:
if stack:
it = stack.pop()
continue
else:
return
if isinstance(x, collections.Iterable) and not isinstance(x, str):
stack.append(it)
it = iter(x)
else:
yield x
https://stackoverflow.com/questions/11503065
复制相似问题