Split a list into two parts based on a filter?

Roy Smith roy at panix.com
Tue Jun 11 20:33:44 EDT 2013


In article <mailman.3023.1370964449.3114.python-list at python.org>,
 Serhiy Storchaka <storchaka at gmail.com> wrote:

> 11.06.13 07:11, Roy Smith написав(ла):
> > In article <mailman.2992.1370904643.3114.python-list at python.org>,
> >   Roel Schroeven <roel at roelschroeven.net> wrote:
> >
> >> new_songs, old_songs = [], []
> >> [(new_songs if s.is_new() else old_songs).append(s) for s in songs]
> >
> > Thanks kind of neat, thanks.
> >
> > I'm trying to figure out what list gets created and discarded.  I think
> > it's [None] * len(songs).
> 
> It is the same as your klunky code, but consumes more memory.

Well, continuing down this somewhat bizarre path:

new_songs, old_songs = [], []
itertools.takewhile(
    lambda x: True,
    (new_songs if s.is_new() else old_songs).append(s) for s in songs)
    )

I'm not sure I got the syntax exactly right, but the idea is anything 
that will iterate over a generator expression.  That at least gets rid 
of the memory requirement to hold the throw-away list :-)



More information about the Python-list mailing list