It's me wrote:
Okay, I give up.
What's the best way to count number of items in a list [that may contain lists]?
a = [[1,2,4],4,5,[2,3]]
def iterall(seq): for item in seq: try: for subitem in iterall(item): yield subitem except TypeError: yield item
all = [x for x in iterall(a)] print len(all)
Beware:
py> list(iterall(['a'])) Traceback (most recent call last): File "<interactive input>", line 1, in ? File "<interactive input>", line 4, in iterall ... File "<interactive input>", line 4, in iterall RuntimeError: maximum recursion depth exceeded
You need to special-case strings. I would do this explicitly, e.g.:
py> def iterall(seq): ... for item in seq: ... if isinstance(item, basestring): ... yield item ... else: ... try: ... for subitem in iterall(item): ... yield subitem ... except TypeError: ... yield item ... py> list(iterall(['a'])) ['a']
but you can also do this by checking for __iter__ as in one of the other posted solutions. (This takes advantage of the fact that strings use the __getitem__ protocol for iteration instead of __iter__.)
Steve -- http://mail.python.org/mailman/listinfo/python-list