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