Velocity Reviews > zip list with different length

# zip list with different length

s99999999s2003@yahoo.com
Guest
Posts: n/a

 04-04-2007
hi
suppose i have 2 lists, a, b then have different number of elements,
say len(a) = 5, len(b) = 3
>>> a = range(5)
>>> b = range(3)
>>> zip(b,a)

[(0, 0), (1, 1), (2, 2)]
>>> zip(a,b)

[(0, 0), (1, 1), (2, 2)]

I want the results to be
[(0, 0), (1, 1), (2, 2) , (3) , (4) ]
can it be done?
thanks

ginstrom
Guest
Posts: n/a

 04-04-2007
On Apr 4, 4:53 pm, (E-Mail Removed) wrote:
> elements, say len(a) = 5, len(b) = 3
> >>> a = range(5)
> >>> b = range(3)

....
> I want the results to be
> [(0, 0), (1, 1), (2, 2) , (3) , (4) ]
> can it be done?

A bit cumbersome, but at least shows it's possible:

>>> def superZip( a, b ):

common = min( len(a), len(b) )
results = zip( a[:common], b[:common] )
if len( a ) < len( b ):
a = b
return results + [ (x,) for x in a[common:] ]

>>> superZip( range( 5 ), range( 3 ) )

[(0, 0), (1, 1), (2, 2), (3,), (4,)]
>>> superZip( range( 3 ), range( 5 ) )

[(0, 0), (1, 1), (2, 2), (3,), (4,)]
>>> superZip( range( 0 ), range( 5 ) )

[(0,), (1,), (2,), (3,), (4,)]
>>> superZip( range( 3 ), range( 3 ) )

[(0, 0), (1, 1), (2, 2)]

Regards,
Ryan Ginstrom

MC
Guest
Posts: n/a

 04-04-2007
Hi!

a = range(5)
b = range(3)
print zip(a+[None]*(len(b)-len(a)),b+[None]*(len(a)-len(b)))

--
@-salutations

Michel Claveau

Peter Otten
Guest
Posts: n/a

 04-04-2007
http://www.velocityreviews.com/forums/(E-Mail Removed) wrote:

> suppose i have 2 lists, a, b then have different number of elements,
> say len(a) = 5, len(b) = 3
>>>> a = range(5)
>>>> b = range(3)
>>>> zip(b,a)

> [(0, 0), (1, 1), (2, 2)]
>>>> zip(a,b)

> [(0, 0), (1, 1), (2, 2)]
>
> I want the results to be
> [(0, 0), (1, 1), (2, 2) , (3) , (4) ]
> can it be done?
> thanks

from itertools import izip, chain, repeat, takewhile, starmap

def zip_longest(*seqs):
padded = [chain(izip(s), repeat(())) for s in seqs]

Just to bring itertools to your attention

Peter

Alexander Schmolck
Guest
Posts: n/a

 04-04-2007
(E-Mail Removed) writes:

C> hi
> suppose i have 2 lists, a, b then have different number of elements,
> say len(a) = 5, len(b) = 3
> >>> a = range(5)
> >>> b = range(3)
> >>> zip(b,a)

> [(0, 0), (1, 1), (2, 2)]
> >>> zip(a,b)

> [(0, 0), (1, 1), (2, 2)]
>
> I want the results to be
> [(0, 0), (1, 1), (2, 2) , (3) , (4) ]
> can it be done?

map(lambda *t: filter(lambda x: x is not None,t),a,b)

'as

Alexander Schmolck
Guest
Posts: n/a

 04-04-2007
MC <(E-Mail Removed)> writes:

> Hi!
>
> Brutal, not exact answer, but:
>
> a = range(5)
> b = range(3)
> print zip(a+[None]*(len(b)-len(a)),b+[None]*(len(a)-len(b)))

You reinvented map(None,a,b).

'as