The best answers to the question “Transpose list of lists” in the category Dev.

__QUESTION__:

Let’s take:

```
l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
```

The result I’m looking for is

```
r = [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
```

and not

```
r = [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
```

Much appreciated

__ANSWER__:

One way to do it is with NumPy transpose. For a list, a:

```
>>> import numpy as np
>>> np.array(a).T.tolist()
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
```

Or another one without zip:

```
>>> map(list,map(None,*a))
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
```

__ANSWER__:

Python 3:

```
# short circuits at shortest nested list if table is jagged:
list(map(list, zip(*l)))
# discards no data if jagged and fills short nested lists with None
list(map(list, itertools.zip_longest(*l, fillvalue=None)))
```

Python 2:

```
map(list, zip(*l))
```

```
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
```

Explanation:

There are two things we need to know to understand what’s going on:

- The signature of zip:
`zip(*iterables)`

This means`zip`

expects an arbitrary number of arguments each of which must be iterable. E.g.`zip([1, 2], [3, 4], [5, 6])`

. - Unpacked argument lists: Given a sequence of arguments
`args`

,`f(*args)`

will call`f`

such that each element in`args`

is a separate positional argument of`f`

. `itertools.zip_longest`

does not discard any data if the number of elements of the nested lists are not the same (homogenous), and instead fills in the shorter nested lists*then*zips them up.

Coming back to the input from the question `l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]`

, `zip(*l)`

would be equivalent to `zip([1, 2, 3], [4, 5, 6], [7, 8, 9])`

. The rest is just making sure the result is a list of lists instead of a list of tuples.

__ANSWER__:

just for fun, valid rectangles and assuming that m[0] exists

```
>>> m = [[1,2,3],[4,5,6],[7,8,9]]
>>> [[row[i] for row in m] for i in range(len(m[0]))]
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
```

__ANSWER__:

Equivalently to Jena’s solution:

```
>>> l=[[1,2,3],[4,5,6],[7,8,9]]
>>> [list(i) for i in zip(*l)]
... [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
```