The voodoo of zip(*someList)

David Wilson dw at botanicus.net
Mon Aug 30 04:27:01 EDT 2004


Message Drop Box wrote:

>All,
>
>How (and why) does zip(*someList) work? 
>
>  
>
>>>>s = [[1, 2, 3], ['one', 'two', 'three'], ['I', 'II', 'III']]
>>>>zip(*s)
>>>>        
>>>>
>[(1, 'one', 'I'), (2, 'two', 'II'), (3, 'three', 'III')]
>
>I've never seen the star '*' outside of function/method definitions
>and I've looked in the Python documentation without success. This
>syntax is voodoo to me at the moment. I'm stumped.
>
>Thanks,
>Stuart
>  
>
Help on built-in function zip:

zip(...)
    zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]

    Return a list of tuples, where each tuple contains the i-th element
    from each of the argument sequences.  The returned list is truncated
    in length to the length of the shortest argument sequence.


On the asterisk syntax:
    http://docs.python.org/tut/node6.html#SECTION006730000000000000000
    http://docs.python.org/ref/calls.html


Basically,

    your_sequence = [ 1, 2, 3, 4 ]
    zip(*your_sequence)

is equivalent to:

    zip(1, 2, 3, 4)

In other words, it allows you to programmatically build an argument 
list. Similarly,

    your_mapping = { 'cmpfunc': lambda x: x }
    some_list = [ 3, 1, 6, 2 ]
    some_list.sort(**your_mapping)

is equivalent to:

    zip(cmpfunc = lambda x: x)



The zip function takes an item from each of the sequences given as 
arguments, and packs them into a tuple, continuing until the sequences 
are exhausted.

    seq1 = [ 1, 2, 3, 4 ]
    seq2 = [ 4, 3, 2, 1 ]
    seq3 = "dave"

    zip(seq1, seq2) is:
    [ (1, 4),  (2, 3),  (3, 2),  (4, 1) ]

    zip(seq1, seq2, seq3) is:
    [ (1, 4, "d"),  (2, 3, "a"),  (3, 2, "v"),  (4, 1, "e") ]

There is also an itertools.izip which does the same thing in a 
generator. HTH,


David.



More information about the Python-list mailing list