# Statement (un)equality

James Henderson james at logicalprogression.net
Fri Feb 20 12:12:47 CET 2004

```On Friday 20 February 2004 10:31 am, Adam Przybyla wrote:
> Python 2.3 (#3, Aug  4 2003, 16:43:33)
> [GCC 2.96 20000731 (Red Hat Linux 7.1 2.96-98)] on linux2
>
> >>> [[y,x] for x,y in [1,2],[3,4]]
>
> [[2, 1], [4, 3]]
>
> >>> map(lambda x,y: [y,x], [1,2],[3,4])
>
> [[3, 1], [4, 2]]
>
> Why there is a difference?

Hi,

[[y,x] for x,y in [1,2],[3,4]]

is just the same as:

[[y,x] for (x,y) in ([1,2],[3,4])]

The list comprehension regards "[1,2],[3,4]" as a single argument (a tuple)
and "x,y" is also a tuple.  "x,y" is assigned first [1,2] and then [3,4].

In the map statement "[1,2],[3,4]" are two different arguments.  map's
signature allows for any number of iterables to be passed after the first
argument.

> How to make the same thing like in map
> statement?

zip() gives you the sequence of pairs you want to pass:  (zip() is very
similar to map with None as the first arguemnt.  The difference is how they
handle sequences of unequal length.)

>>> zip([1,2],[3,4])
[(1, 3), (2, 4)]

so:

[[y,x] for x,y in zip([1,2],[3,4])]

will match the behaviour of the map statement.

> Regards