Brad <schi...@gmail.com> writes: > On Jul 2, 8:14 pm, Paul Rubin <http://phr...@nospam.invalid> wrote: > > schickb <schi...@gmail.com> writes: > > > def split(seq, func=None): > > > if func is None: > > > func = bool > > > t, f = [], [] > > > for item in seq: > > > if func(item): > > > t.append(item) > > > else: > > > f.append(item) > > > return (t, f) > > > > untested: > > > > def split(seq, func=bool): > > xs = zip(seq, itertools.imap(func, seq)) > > t = list(x for (x,y) in xs if y) > > f = list(x for (x,y) in xs if not y) > > return (t, f) > > In my testing that is 3.5x slower than the original solution (and less > clear imo). I fixed my version to take a bool default. Either way, I'm > not really looking for additional ways to do this in Python unless > I've totally missed something. What I am considering is writing it in > C, much like filter.
I'm a little skeptical that the C version will help much, if it's evaluating a python function at every list element. Here's a variant of your version: def split(seq, func=bool): t, f = [], [] ta, fa = t.append, f.append for item in seq: (ta if func(item) else fa)(item) return (t, f) This avoids some dict lookups and copying. I wonder if that helps significantly. -- http://mail.python.org/mailman/listinfo/python-list