Scott David Daniels wrote:
Nick Coghlan wrote:
A custom generator will do nicely:
Py> def flatten(seq): ... for x in seq: ... if hasattr(x, "__iter__"): ... for y in flatten(x): ... yield y ... else: ... yield x
Avoiding LBYL gives you: def flatten(seq): for x in seq: try: for y in flatten(x): yield y except TypeError: yield x
If I'm not mistaken, this will result in infinite recursion on strings. 'for x in aString' will iterate over the characters in the string, even if the string is only a single character, so "for y in flatten('a'):" will not give a type error. You'd need to add special-case tests to watch for this condition (and try not to be too special-case and allow unicode objects to pass).
Nick's version works on strings (and unicode objects) because they lack an __iter__() method, even though they follow the (older) sequence protocol.
Jeff Shannon Technician/Programmer Credit International
-- http://mail.python.org/mailman/listinfo/python-list