[Baypiggies] Baypiggies snippets

Alex Martelli aleax at google.com
Thu Mar 22 01:32:27 CET 2007


On 3/21/07, Keith Dart ♂ <keith at dartworks.biz> wrote:
>
> Maybe Baypiggies can have a Python snippets night? or a snippets area
> on the web site.
>
> Here is one I recently did. Any comments? Improvements?
>
> def flatten(alist):
>     rv = []
>     for val in alist:
>         if isinstance(val, list):
>             rv.extend(flatten(val))
>         else:
>             rv.append(val)
>     return rv
>
>
> This takes a list that may have embedded lists, to any depth, and
> flattens it to a single list.


A generator equivalent can sometimes be more flexible (you might want to
process the leaves one by one rather than building their list in memory,
etc), and is also easily expressed:

def flatgen(alist):
  for val in alist:
    if isinstance(val, list):
        for val in flatgen(val): yield val
    else:
        yield val

list(flatgen(alist)) is of course equivalent to your function (though
probably slower:-).

It may be interesting that flatgen makes it easy to eliminate recursion
(maybe interesting if the nesting level can be thousands-deep:-) by keeping
an explicit stack (warning, untested code):

def flatgeni(alist):
  stack = [iter(alist)]
  while stack:
    try:
      val = stack[-1].next()
    except StopIteration:
      stack.pop()
      continue
    if isinstance(val, list):
      stack.append(iter(val))
    else:
      yield val



Alex
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.python.org/pipermail/baypiggies/attachments/20070321/e7bb4903/attachment.html 


More information about the Baypiggies mailing list