The only problem with this if it is to big or to deeply nested then
it will overflow the stack?
Danny Yoo has given a mind-blowing continuation implementation that will not overflow the stack. Below goes a recursive-iterator implementation. To avoid deep recursion the code can simluate its own stack (or hope that Python gains tail-call optimization *grin*) but for simplicity's sake we just use recursion.
def isIterable(iterable):
"""Test for iterable-ness."""
try:
iter(iterable)
except TypeError:
return False
return Truedef isBadIterable(iterable):
"""Return True if it's a 'bad' iterable.Note: string's are bad because, when iterated they return strings making itterflatten loop infinitely.
"""
return isinstance(iterable, basestring)
def iterflatten(iterable):
"""Return a flattened iterator."""
it = iter(iterable)
for e in it:
if isIterable(e) and not isBadIterable(e):
#Recurse into iterators.
for f in iterflatten(e):
yield f
else:
yield eA test:
for elem in iterflatten([1,
2,
[3, 4, (5, 6), 7],
8,
[9],
[10, 11, iter([12, 13])]]):
print elemAnd it gives:
>>> 1 2 3 4 5 6 7 8 9 10 11 12 13
Best regards, G. Rodrigues _______________________________________________ Tutor maillist - [email protected] http://mail.python.org/mailman/listinfo/tutor
