opposite of zip()?

rasmus matt.rasmus at gmail.com
Sat Dec 15 13:04:36 EST 2007


On Dec 15, 4:45 am, Gary Herron <gher... at islandtraining.com> wrote:
> igor.tatari... at gmail.com wrote:
> > Hi folks,
>
> > Thanks, for all the help. I tried running the various options, and
> > here is what I found:
>
> > from array import array
> > from time import time
>
> > def f1(recs, cols):
> >     for r in recs:
> >         for i,v in enumerate(r):
> >             cols[i].append(v)
>
> > def f2(recs, cols):
> >     for r in recs:
> >         for v,c in zip(r, cols):
> >             c.append(v)
>
> > def f3(recs, cols):
> >     for r in recs:
> >         map(list.append, cols, r)
>
> > def f4(recs):
> >     return zip(*recs)
>
> > records = [ tuple(range(10)) for i in xrange(1000000) ]
>
> > columns = tuple([] for i in xrange(10))
> > t = time()
> > f1(records, columns)
> > print 'f1: ', time()-t
>
> > columns = tuple([] for i in xrange(10))
> > t = time()
> > f2(records, columns)
> > print 'f2: ', time()-t
>
> > columns = tuple([] for i in xrange(10))
> > t = time()
> > f3(records, columns)
> > print 'f3: ', time()-t
>
> > t = time()
> > columns = f4(records)
> > print 'f4: ', time()-t
>
> > f1:  5.10132408142
> > f2:  5.06787180901
> > f3:  4.04700708389
> > f4:  19.13633203506
>
> > So there is some benefit in using map(list.append). f4 is very clever
> > and cool but it doesn't seem to scale.
>
> > Incidentally, it took me a while to figure out why the following
> > initialization doesn't work:
> >   columns = ([],)*10
> > apparently you end up with 10 copies of the same list.
>
> Yes.  A well known gotcha in Python and a FAQ.
>
> > Finally, in my case the output columns are integer arrays (to save
> > memory). I can still use array.append but it's a little slower so the
> > difference between f1-f3 gets even smaller. f4 is not an option with
> > arrays.

If you want another answer.  The opposite of zip(lists) is zip(*
list_of_tuples)

That is:
lists == zip(zip(* lists))

I don't know about its speed though compared to the other suggestions.

Matt



More information about the Python-list mailing list