我想知道如何编写Python的功能,可展平发生器来产生另一个发电机或iteables(也可产生另一个发电机/ iterables ...可能无限)。
下面是例子:
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。
谢谢!
最简单的方法是一个递归平坦化作用。 假设你要下降到除了字符串每次迭代,你可以这样做:
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
的非递归方法在本质上是递归的方法的展开,使用堆栈:
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