Code question

George Sakkis george.sakkis at gmail.com
Mon Apr 21 19:16:46 EDT 2008


On Apr 21, 4:42 pm, Matimus <mccre... at gmail.com> wrote:
> On Apr 21, 12:05 pm, <jyoun... at kc.rr.com> wrote:
>
>
>
> > I've been trying to figure out a way to combine lists similar to how zip() works.  The main
> > difference though is I want to work with different length lists and combine them.  I came up with
> > the example below, which returns a list like I'm wanting.  I'm assuming it's somewhat efficient
> > (although I wonder if the lists were huge that the 'if' statement might slow things down?).
>
> > If anyone has time, I was wondering if you could share your thoughts on whether this is an
> > efficient way to do something like this, if it's horrible and slow, etc.
>
> > Thanks!
>
> > Jay
>
> > # ----------------------------
>
> > def combineLists(theLists):
> >     cntList = len(theLists)
> >     lenList = [len(x) for x in theLists]
>
> >     maxList = max(lenList)
>
> >     combinedList = []
>
> >     for x in range(maxList):
> >         for n in range(cntList):
> >             if lenList[n] > x: combinedList.append(theLists[n][x])
>
> >     print combinedList
>
> > combineLists([a, b, c])
>
> > # ----------------------------
>
> > # --> ['a', '1', 'a1', 'b', '2', 'b2', 'c', 'c3', 'd4', 'e5']
>
> I would probably do something like this:
>
> >>> def combine(*seqs):
>
> ...    seqs = [iter(s) for s in seqs]
> ...    while seqs:
> ...       for g in seqs:
> ...          try:
> ...             yield g.next()
> ...          except StopIteration:
> ...             seqs.remove(g)
> ...>>> a = 'abc'
> >>> b = '12'
> >>> c = 'a1 b2 c3 d4 e5'.split()
> >>> list(combine(a,b,c))
>
> ['a', '1', 'a1', 'b', '2', 'b2', 'c', 'c3', 'd4', 'e5']
>
> It has the advantage that it uses the generator protocol, so you can
> pass in any type of sequence. It uses arbitrary arguments to make its
> use closer to that of zip. It is also a generator, so it takes
> advantage of lazy evaluation. Notice that there is never any checking
> of length.
>
> Matt

A similar solution using the itertools module:
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/528936

George



More information about the Python-list mailing list